指针

指针分为:

字符指针,指针数组,数组指针

字符数组:是用于存放字符的指针

指针数组:是存放指针的数组

数组指针:是指向数组的指针,存放的是数组的地址

第一个arr,因为数组名表示首元素的地址,是int*类型,加一的话,就是往后加4个字节

第二个&arr【0】表示的是首元素的地址,也是int*类型,加一的话,就是往后加4个字节

第三个&arr是取出整个数组放在了指针,而它的类型是int(*)【10】=arr,加一的话,就是加上一整个数组的长度

&arr,这里的数组名表示的是整个数组,取出的是整个数组的地址,从地址值的角度和数组首元素的地址是一样的,他们的意义是完全不同的,

 

二维数组的数组名也是首元素的地址,但是二维数组的首元素是第一行的整个一维数组,所以使用函数传参传的是第一行的一维数组,

二维数组传参使用指针,这里的int(*arr)【4】是指传过去的是arr这个指针,每个指针是4个元素,都是int类型

 

函数指针:

int (*pf)(int , int)= add//函数的地址要存放起来,就得放在函数指针变量中

函数的类型,函数指针的名字,函数传参的类型

函数名就是函数的地址,和&函数是一样的,

 

函数指针数组;

就是在函数指针的基础上在函数名后面加上数组大小

int (* p【10】)(int,int)= {函数1,函数2,函数3,函数4}

 

指向函数指针数组的指针;

取出函数指针数组的地址,放在一个指针变量里

int (*pfarr[4])(int ,int ) = {ADD, SUB};

ppfarr = &pfarr //ppfarr是一个指向函数指针数组的指针

int (*(*ppfarr)[4])(int ,int ) = &pfarr;//先把ppfarr作为一个单独的指针,指向一个数组,类型就是函数指针

 

回调函数:

使用函数调用函数指针调用函数

 

数组名的意义:

数组名单独在sizeof里面,这里的数组名就直接表示整个数组,计算的是整个数组的大小

&数组名,这里的数组名表示整个数组,取出的是整个数组的地址

除此之外,其他的数组名都表示首元素的地址

 

 

 

 

 

 

 

 第一个是计算整个二维数组的大小

第二个是计算第一行第一个元素的大小

第三个是计算第一行的大小

第四个是计算第一行第二个元素的大小

第五个是计算第一行第二个元素的大小,因为a[0]+1是找到第一行第二个元素的地址,解引用是访问第二个元素

第六个是计算第二行的地址,因为a代表首元素的地址,在二维数组中首元素的地址表示第一行的地址,所以+1是表示第二行的地址,不管是计算什么类型的地址都是4/8字节

第七个是计算第二行全部元素的大小,因为a代表首元素的地址,在二维数组中首元素的地址表示第一行的地址,所以+1是表示第二行的地址,解引用访问第二行的元素

 第八个是计算第二行所有元素的大小
第九个是计算第一行的所有元素的大小
第十个是计算第四行的大小,在sizeof中没有越界的说法,只是计算大小,

 

二维数组的存储也是连续的
1 2 3 4 5 6 7 8 9 10 11 12

 

posted @ 2024-09-04 21:30  油头男孩  阅读(12)  评论(0编辑  收藏  举报