全指针知识点+指针的深度解析+数组知识点+指针与数组的纠葛

指针的本质:
指针的本质就是一个变量,只不过该变量的值为一个地址,指针变量简称为指针。
int p; p(指针变量本身)是int *类型;*p(指针指向的那个变量)是int类型。
使用指针的三部曲:
1、定义指针变量
2、关联指针变量
3、指针变量的解引用
指针所占内存:
在32位系统中 不管是什么类型的指针,所有指针的长度都为4个字节。
野指针:
1、野指针,就是未初始化的指针变量,指针指向的位置是不可知的(随机的/错误的/未知的)。
2、怎样避免野指针
定义指针时,同时初始化为NULL=>将指针赋值(绑定给一个可用地址空间)=>判断这个指针是不是NULL(不是NULL,则继续进行)=>在使用完之后,将指针赋值为NULL。
const关键字与指针的关系:
const关键字主要用于函数传参中的输入型参数,在函数传参中如果传的是普通变量,那肯定是输入型参数;如果传的是指针的话,前面用const修饰的指针变量则为输入型参数,如果前面没有const修饰的话则为输出型参数。
const关键字与指针的4中结合方式:
1、const int *p; p本身可变,p所指向的变量是不可变的
2、int const *p; p本身可变,p所指向的变量是不可变的
3、int *const p; p本身不可变,p所指向的变量是可变的
4、const int *p const p; p本身不可变,p所指向的变量也是不可变的
数组的深度解析:
用例子说明数组:
定义数组int a[10];
a 做右值 表示数组首元素的首地址
a[0] 做右值 表示数组首元素
&a 做右值 表示整个数组的首地址(数值上=a=&a[0])
&a[0] 做右值 表示首元素的首地址
a[0] 做左值 表示数组第0个元素对应的内存空间
&a[0] 做左值 表示数组首元素对应的内存空间
数组只能进行单元访问,不能整体访问
a、&a[0]、&a三者在类型上的区别:
a为元素的指针,int *类型
&a[0] 为元素的指针,int *类型
&a 为整个数组的指针,int ( * )[10]类型
数组与指针的纠葛:
数组用下标的方式来访问元素,其实质还是通过指针来实现的,只不过语言本身对其进行了封装。
数组格式来访问数组元素是:数组名[下标];
指针格式来访问数组元素是: * (指针+偏移量)
eg:int *p; int a[5]; p=a;
访问时分别为:b = a[1] ; b= * (p+1);
指针参与运算的特点是:
指针变量的+1,并不是真正的+1,而是+1 *sizeof(指针类型)
在利用sizeof计算数组所占的内存空间时,sizeof(数组名)表示的是整个数组所占的内存空间。
typedef与指针之间的关系:
两种指针宏定义方式:
#define dpchar char *
typedef char *tpchar;
两种宏解释方式如下:
dpchar p1, p2; //sizeof(p1)=4,sizeof(p2)=1
tpchar p3, p4; //sizeof(p3)=4,sizeof(p4)=4
dpchar p1, p2; 可分解为char *p1,char p2
dpchar p3, p4; 可分解为char *p3,char *p4
typedef与const结合:
举例说明;
typedef int *pint; const pint p1;<=>int *const p1;p1本身不可变,p1指向的变量可变。
typedef int *pint; pint const p1;<=>int *const p1;p1本身不可变,p1指向的变量可变。
typedef const int *pint; pint p1;<=> const int *p1;p1本身可变,p1指向的变量不可变。
typedef char *( *pfunc)(char *,char *);<=>pfunc(类型为char *( *)(char *,char *))
指针数组与数组指针:
指针数组:是一个数组,只不过该数组中的元素为指针变量。
数组指针:是一个指针,只不过该指针指向的是一个数组。
举例:int * p[5]与int *(p[5])两者为指针数组,int (*p)[5]为数组指针
([ ]的优先级高于 *)
函数指针:
函数指针的实质也是一个普通的变量,不过该变量的类型为函数指针变量类型,它的值就是某个函数地址(函数的地址也就是函数名在编译器中对于的值(实质还是函数名))。
举例说明:
viod (*p)(viod);
//p表示变量名,函数指针的类型为viod ( * )viod类型。
函数原型为:char *strcpy(char *dest,const char *src);
对应的函数指针为:char *(*pfunc)(char *dest,const char *src);
//pfunc为函数指针的变量名,函数指针的类型为char *( *)(char *dest,const char *src);
二重指针与二维数组:
二重指针用**p表示,二维数组用数组名[ i ][ j ]表示。
二重指针本质上也是一个 指针变量,不过它指向的变量是一个一重指针(也可以说它指向的是一个地址)。
二重指针<=>指针数组指针(指针数组的指针(也就是指向指针数组的指针变量))
访问方式:数组名[i][j]<=> *( *(p+i)+j)
二维数组的数组名表示二维数组中第一维数组中首元素的首地址(也就是第二维的数组的首地址)。
二维数组的数组名与数组指针类型匹配; int ( *p)[i];a[i][j] ;p=a; //类型匹配。
指针指向二维数组的元素;int *p=&a[i][j];

发布了19 篇原创文章 · 获赞 11 · 访问量 3397

猜你喜欢

转载自blog.csdn.net/m0_46204326/article/details/104249971
今日推荐