重要干货放前边:
对于分辨指针的类型的方法(感谢大佬的思路):
从变量名开始(前边为数据类型说明符)后边依据运算符的前后顺序结合
例:
int * arr[ ]
因为[ ]优先级比*高,所以arr先与 [ ]结合,所以为一个数组,数据类型是int 型 所以该句是一个数组(数组里面的数据类型是指针类型)即 指针数组。
又如 int ( arr)[10]。因为()运算符优先级高 所以 先知道 它是一个变量 ,然后与[ ]
结合 就是一个指向数组的一个指针,然后与int 结合,所以为 一个指向数组的指针(数组的类型为int 型)
基本概念
1.首先要明确指针是一个存着地址的变量
2.指针的声明格式:
数据类型 * 变量名
在这里,解引用操作符(*),用于帮助编译器识别它是一个指针变量
3.指针变量的大小
在32位平台下,指针变量的大小(int *,char *,float * ,double *,void *)的大小都为4个字节。事实上,结构体的指针变量大小也为4个字节
4.指针赋值的方法
a.利用指针地址(&)分配变量的地址。
int x=40;
int *ptr; ptr=&x;
b.让指针变量指向来自堆的动态分配地址
int *ptr;
ptr=(int *)malloc(sizeof(int));
5.二级指针
声明方式:
类型说明符 * * 变量名
二级指针是一个指向指针变量的指针
(因为指针变量虽然存着别人的地址,不过它也是有自己的地址的)
指针运算
能使用以下运算符:
++
+
-(减号)
不能使用除法与乘法操作符
1.指针加法
<指针变量>=<指针变量>+<增加值>
到
<指针变量>=<指针变量>+<指针变量数据类型大小> *<增加值>
指针变量加偏移量是非常合法的操作,但不允许将指针变量加入另一个指针变量中。
Ptx1=Ptr1+Ptr2;//不合法
(减法同理)
2.两个指针变量的减法
当两个指针变量分别指向数组连续内存地址的不同位置,让它们彼
此相减得到结果差表示两个指针变量间存在的元素数目。