前置
按照 ANSI(American National Standards Institute) 标准,不能对 void 指针进行算法操作。
ANSI标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的。
指针+1所增加的地址值为这个指针类型所占用的内存大小的值。
6.1 一级指针
-
int * p ; → 声明指针变量 p
-
指针的内存空间为 4byte;
-
面试的时候问你,指针在内存中占多少个字节? 这就是个问题不是简单的2,4,甚至8个字节 回答:指针在内存中所在的字节数是由系统的寻址能力决定的,寻址能力就是CPU对于该数据范围处理的极限能力,理论上32位系统的寻址能力是2的32次,也就是32bit,按照一个字节8bit来算就是4个字节。16位系统是2个字节,64位的就是8个字节。寻址能力是由系统的硬件决定的,也就是总线的位数。 简单的总结下,16位的2字节,32位的4字节,64位的8字节,由系统的寻址能力决定。
-
-
指针 p → 用来存储变量的地址
-
*p → 用来取 p变量存的地址处 的 内容
-
声明时:int *p,q; q为整型不为指针;
-
int *q 声明后马上要初始化,如果不初始化,他就是一个野指针,不知道指向了内存中的什么位置,如果对该指针进行赋值操作的话,值就不知道存到什么地方去了
-
指针的初始化 以及 赋值 ,应该 以 “地址” 赋值 → int a = 2; int * p = &a , *q; q = &a;
-
arr[10] 数组的名便可代表此数组的首地址,且arr为地址常量,不可在声明后,直接 arr = "ad" 赋值,所以赋值时,不可 p = &arr,而是 int *p = arr;
-
指针可自加 → p++,内存中跳过 一个类型大小
-
一维数组可认为自带的一个指针,如 arr[] , 但不能进行 arr++ 操作,可进行 arr+1 取地址操作;
arr[] = {1,2,3,4,5}、printf("%d", *arr ); → 1
printf("%d", *(arr+1) ); → 2
printf("%d", *arr+2 ); → 3
-
指向数组的两个指针 互减 输出值之间的元素个数
int p,q;
p = a ;
q = a + 4 ;
printf("%d", q-p); → 4
-
指针的初始值在每次使用之前都需要 check 一下,例如 p++ 时;
-
当 声明 int *p = a; 时,p就是数组的名字,可以 以 p[i] 的形式 读取与使用 数组 a[] 内的值,
-
且在p[i] 运行的过程中,p所存的地址不变,但是在 p++ 之后的 p[i] 会加一读取内容。
-
同时,若 不指向 a[ ],p也可以 使用 p[ ]
6.2 二级指针
-
直接寻址 → 通过变量的名字访问到变量的空间,直接改址
-
间接寻址 → 用指针把变量的地址保存上,后通过指针指向的地址找到变量的存储空间,修改其值、一级指针 存的是变量的地址、二级指针 存的是一级指针的地址、如果通过指针改变变量的值的时候是用*来取内容进行改变。
在指针作为参数或返回值时 才有意义。 例如: **ppa ---- *pa ---- a=3 pa = &a; ppa = &pa; **ppa == a;
6.3 const + 指针
「拆分法」(最通用)
把声明从右往左读,const 修饰的是「最近的标识符」:
const char *c → 读为:c is a pointer to a const char(c 是指向 “只读字符” 的指针);
char const *c → 读为:c is a pointer to a char const(和上面完全一样,
const char = char const);
char * const c → 读为:c is a const pointer to a char(c 是 “只读指针”,指向普通字符)。
实践:
char const * const *p;
这是一个二级指针,二级指针p指向一个常量指针*p,常量指针指向一个const char **p
这个二级指针可变,指向的一级指针不可变,指向的变量不可变

7043

被折叠的 条评论
为什么被折叠?



