朱有鹏老师课程总结指针数组和数组指针
字面意思理解
指针数组:实质是一个数组,这个数组中存储的内容全部是指针变量
数组指针:实质是一个指针,这个指针指向一个数组
第一个: int *p[5];
核心是p,先与[]结合组成一个数组,共有5个元素,数组中的元素都是指针,指针指向的元素是int类型,整个符号是一个数组。
第二个:int (*p)[5];
核心是p,p先和星号结合组成一个指针,指针指向一个数组,数组有5个元素,数组中存放的是int类型的元素,整个符号是一个指针。
第三个: int *(p[5]);
和第一个含义一样,加上括号,便于理解和辨识。
关键在与搞清楚所定义的核心首先是和哪个符号先结合的。和星号先结合,就是指针,和[]先结合,就是数组。
指针数组简单应用
int a = 1,b = 2,c = 3,d = 4,e = 5;
int *(p[5]);
int i;
p[0] = &a;
p[1] = &b;
p[2] = &c;
p[3] = &d;
p[4] = &e;
printf("a的地址:0X%p\n",&a);
printf("b的地址:0X%p\n",&b);
printf("c的地址:0X%p\n",&c);
printf("d的地址:0X%p\n",&d);
printf("e的地址:0X%p\n",&e);
putchar('\n');
for(i=0;i<5;i++)
{
printf("p[%d]内的地址:0X%p\n",i,p[i]);
}
先将5个int类型变量的地址都存放进指针数组p内部,分别打印出普通int变量的地址,以及指针数组中每个元素内的值,和指针数组中每个元素指向的变量的值。对比其结果
从结果可以知道,指针数组内部每个变量内存放的就是相对应的五个int类型变量的地址;指针数组中每个元素指向的变量的值也都分别等于五个int类型的变量的值。
所以指针数组可以简单的理解为,一个只能用于存放某种类型变量的地址的数组。可以批量管理某一种指针类型。int *p[5];和int *(p[5]);就和定义了5个int *;类型的指针变量没有区别。
int arr[5] = {1,2,3,4,5};
int *(p[5]);
for(i=0;i<5;i++)
{
p[i] = &arr[i];
}
for(i=0;i<5;i++)
{
printf("arr[%d]的地址:0X%p\n",i,&(arr[i]));
}
putchar('\n');
for(i=0;i<5;i++)
{
printf("p[%d]内的地址所指向的值:%d\n",i,*(p[i]));
}
存放数组的地址也是可以的。
数组指针简单应用
int a[5]={1,2,3,4,5};
int (*p)[5];
int i;
p = &a;
printf("数组a[5]的首地址:%p\n",&a);
printf("数组指针p内部的地址:%p\n",p);
putchar('\n');
for(i=0;i<5;i++)
{
printf("(*p)[%d] = %d\n",i,(*p)[i]);
printf("*((*p)+%d) = %d\n",i,*((*p)+i));
}
将数组a[5]的首地址给数组指针p,查看数组a[5]的地址和数组指针内的值是否相等。并且利用数组指针打印出a[5]的值。
运行结果
可以看出,结果没问题。数组指针就是指向了a[5]数组的首地址。数组指针的空间只有32位大小,内部只能存放一个数组的首地址,实质上就是一个指向数组的指针变量。这里用了两种方法用指针输出了a[5]中的值。此时的(*p)[]就相当于a[],(*p)+1就相当与a+1。第一种输出方式和数组普通方式输出没区别。第二种输出方式和数组用指针方式输出没区别。(星号p)可以认为就是数组名。括号不能省略,因为[]的优先级比()更高。去掉括号,就相当于(星号(p[]))。结果就会出错。
本文地址:https://blog.csdn.net/qq_16981075/article/details/107294587
上一篇: C# 两种方式反编译修改源码(dnspy,ildasm & ilasm)
下一篇: 第五讲练习