C语言基础知识之(十三):指针、指针和数组
来源:互联网 发布:彩票合买代购源码 编辑:程序博客网 时间:2024/05/17 08:18
一、指针的声明和定义
1、访问数据一般有两种方式:直接、间接
直接:通过变量访问数据,
如:通过变量a访问内存单元。
int a = 10;
printf("%d\n",a);
间接:通过内存单元的地址访问数据。取地址符&,获取变量a所在的地址并用%p打印。
printf("变量a存储单元的地址:%p\n",&a);
2、指针的定义
存储内存单元地址的变量称为:指针
指针变量是用来存储地址的。
语法:
类型修饰符 * 变量名 = 初始值(地址);
例:定义指针变量保存变量a内存单元的地址,并打印保存的地址。
int * p = &a;
printf("变量a存储单元的地址:%p\n", p);
3、定义指针变量
NULL表示空指针,表示0,专门给指针变量赋值用的。
int * p = NULL; //类似于inta = 0;
float * q = NULL;
char * r = NULL;
说明:
* 表示:定义的变量是指针变量,用来存储地址。
类型修饰符表示指针变量中的地址 操作的内存单元中存储的数据类型
指针变量的类型:类型修饰符*,指向某种数据类型的指针类型
p的类型: int *,指向整型数据的指针类型
q的类型: float *,指向浮点型数据的指针类型
指针变量通常被称为指针
p 整型指针 指向整型数据的指针
q 浮点型指针 指向浮点型数据的指针
r 字符型指针 指向字符型数据的指针
通过指针实现间接访问:先获取存储单元的地址
再使用 * 取值运算符,读取地址内的变量
int a = 100;
int *p = &a; // 获取变量a存储单元的地址
使用间接方式,访问变量a对应的内存单元
printf(“%d\n”, p);//使用*p读取指针p存储的地址中的变量值100.
间接赋值:
*p = 200; //找到p存储的地址后,往内存单元赋值
printf("通过变量a读取数据:%d 通过指针p读取数据:%d\n", a, *p);
printf("变量a内存单元的地址:%p 指针p中存储的地址:%p\n", &a,p);
指针的存储空间与操作系统有关,一个字节8位,故32位的系统指针的存储空间是4个字节,64位的系统指针的存储空间是8个字节。
总结:
& 和 * 是配套使用的运算符,互为逆元算
& 获取变量存储单元的地址。
* 获取指针中的地址后访问变量的存储单元。
定义指针时,使用*是用来表示:p是指针变量。如int*p = NULL;说明p是指向int类型的指针,用来存储对应的int类型变量的地址。
如果*前面没有数据类型修饰,则*是取值运算符,用来读取指针存储地址中的存储单元的值。
二、指针运算
指针的运算只有加、减运算,如:p+1,p-1等,实际上是指针地址的偏移计算,这时指针的指向没有变化。
同时,定义指针时的指针类型,决定了指针移动的字节数。
第一种:p+n,
表示:从p指向的存储单元,向高位偏移N次,每次偏移的字节数等于指针指向的数据类型的字节数。p的指向没有改变,只是p里面存储的地址进行了曾加4个字节的计算。
如:inta = 100;int *p = &a;
printf("%p\n",p);
printf("%p\n",p+1);
printf("%p\n",p+2);
打印的结果显示:p、p+1、p+2他们的地址依次相差4个字节,即int类型占用的4个字节数。
第二种:p-n,向低位移动,同样的p的指向没有改变,只是p里面存储的地址进行了减少4个字节的计算。
第三种:p++,++p,本质是:p = p + 1;所以经过运算后,指针的指向改变了。
第四种:p--,--p,本质是:p = p - 1;同样的,指针经过运算后的指向改变了。
三、指针和数组
数组的基本定义和运算:
1、定义数组
inta[5] = {1, 2, 3, 4, 5};
2、访问数组元素
a[0] = 10;
printf("%d\n",a[0]);
3、计算数组元素的个数
printf("%lu\n", sizeof(a));//数组a的存储空间
printf("%lu\n",sizeof(int));
printf("%lu\n",sizeof(a[0]));//数组a中单个元素的存储空间
printf("元素个数:%lu\n",sizeof(a)/sizeof(a[0]));
4、重点 数组名:表示数组首元素的地址 a = &a[0];
数组和指针
可以使用指针访问数组元素:定义指针,指向数组首元素
访问数组元素的两种方式:下标法、指针法
1、下标法
//使用数组名访问
int a[5] = {11, 12,13, 14, 15};
for (int i = 0; i< 5; i++) {
printf("%d ", a[i]);
}
//使用指针访问
int *p = a; //定义指针,指向首元素
for (int i = 0; i< 5; i++) {
printf("%d ", p[i]);
}
2、指针法:通过指针偏移计算访问数组元素
*(数组名/指针+下标)
//使用数组名
int a[5] = {1, 2, 3,4, 5};
for (int i = 0; i< 5; i++) {
printf("%d ", *(a+i));// a[i] 本质 *(a+i)
}
//使用指针
int *p = a;
for (int i = 0; i< 5; i++) {
printf("%d ", *(p+i));
}
指针和数组的区别
1、指针是变量,可以修改指向;数组名是常量,不可以修改,永远指向第一个元素
2、指针的存储空间:4/8个字节;数组的存储空间:元素个数*单个元素的存储空间
3、sizeof(数组名)得到数组的存储空间;
sizeof(指向数组的指针),不管指针指向谁,只跟操作系统有关,得到指针的存储空间4/8个字节;
指针的类型必须和指向的数据类型匹配。
指针的类型决定了指针访问存储单元的数量。
int * p 一次访问4个存储单元(字节)
char * p 一次访问1个存储单元(字节)- C语言基础知识之(十三):指针、指针和数组
- 【C语言复习(十三)】数组和指针
- C语言基础知识之(十四):指针和字符数组、字符串数组
- C语言基础知识之(十五):指针和函数
- C语言基础知识之(十六):结构体和指针
- C语言学习之数组指针和指针数组
- C语言之指针数组和数组指针
- C语言之指针、数组和函数
- C语言之指针、数组和函数
- C语言之指针、数组和函数
- C语言之指针、数组和函数
- C语言之指针、数组和函数
- C语言之指针、数组和函数
- C语言之指针、数组和函数
- C语言之指针、数组和函数
- C语言之指针、数组和函数
- C语言之指针、数组和函数
- C语言之指针、数组和函数
- Ubuntu下安装ShadowSocks Server和ShadowSocks Client
- DUBBO简介及使用
- 关于内存中栈和堆的区别
- Unity3D有限状态机(FSM)学习笔记【2】IState
- 2015-08-30 一周总结报告
- C语言基础知识之(十三):指针、指针和数组
- 模拟淘宝侧边服务模块鼠标悬停效果的三种实现方式总结
- Alien Order
- Dataguard 重启方法
- CronSequenceGenerator
- 找数
- uImage,zimage,bzimage,vmlinux,vmlinuz
- Jetty JNDI开发实战(上)
- Python 列表学习与使用