前言:指针,是一种存储数据地址的特殊变量。
目录
2.数组指针
3.数组中的指针常量在等号右端时应进行的操作(重点)
4.指针数组
首先,何为变量,即在程序运行过程中,值可能发生变化的量。
我们来声明一个变量。
int i;
int 说明声明的是整形变量,i是变量名,它有自己的地址。我们可以给它赋值。
2.数组指针
我们声明一个数组
int a[2][3][4][5];
此为四维数组。
那么数组名a,此时是一个常量,值是数组元素a[0][0][0][0]的地址。
何为常量(即在程序运行过程中,数值不变的量)(我们也可以用#define 或const声明的形式来声明常量)
以此类推,a[1]是数组元素a[1][0][0][0]的地址,它也是常量
a[1][2]是数组元素a[1][2][0][0]的地址,它也是常量
...............
我们看如下程序(我们申请一个三维数组)
#include<stdio.h>
int main(void)
{
int a[2][2][2];
printf("%p\n",a[1][1]);
printf("%p",&a[1][1][0]);
}
输出结果如下(每次操作结果可能不同)
00000088F30FF800
00000088F30FF800
这也印证了我们的想法
再换个例子依旧如此
#include<stdio.h>
int main(void)
{
int a[2][2][2][2][2];
printf("%p\n",a[0][1]);
printf("%p",&a[0][1][0][0][0]);
}
输出如下
000000F371FFFA60
000000F371FFFA60
再次印证了我们的想法。
3.我们来举一个例子
#include<stdio.h>
int main(void)
{
int a[2][2][2];
printf("%p\n",a);
printf("%p",&a[0][0][0]);
return 0;
}
0000002B956FFC78
0000002B956FFC78
我们看见常量a 与&a[0][0][0]的值相同,按理说,可以在等号右侧直接使用,但是,重点来了。
#include<stdio.h>
int main(void)
{
int a[2][2][2];
int* i;
i = &a[0][0][0];
printf("%p", i);
return 0;
}
000000629552F798
这样操作没问题 但是如果我们这样操作
#include<stdio.h>
int main(void)
{
int a[2][2][2];
int* i;
i = a;
printf("%p", i);
return 0;
}
编译器则会报错。
这时我们提出一个原则,数组中的指针常量若想在等号右边使用,数组名前的星号数和数组后的中括号数之和必须为维度数-1。
操作应该为
#include<stdio.h>
int main(void)
{
int a[2][2][2];
int* i;
i = **a;
printf("%p", i);
return 0;
}
补充,因为a为常量,不占用内存,所以&a毫无意义,相当于&a[0][0][0],也相当于a.
4.指针数组(准确来说是地址数组)
顾名思义,就是数组中的元素类型是地址的数组。
我们来看一个实例
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int *a[10];
int i=0;
for(;i<10;i++)
{
a[i]=(int*)malloc(sizeof(int));
}
i=0;
for(;i<10;i++)
{
printf("%p\n",a[i]);
}
return 0;
}
输出结果如下
000002A9DEDC6750
000002A9DEDC62D0
000002A9DEDC6310
000002A9DEDC6110
000002A9DEDC5E50
000002A9DEDC6350
000002A9DEDC6850
000002A9DEDC6190
000002A9DEDC6390
000002A9DEDC6B90
数组中的每个元素存储的都是整型变量的地址。
要注意,stdlib.h中的malloc函数申请变量空间,它对应着有地址,我们通过如下写法
a[i]=(int*)malloc(sizeof(int));
可以把申请到的空间的地址赋值给数组中的每一个元素。
但是可惜的是,malloc只可以申请变量空间,它当然会有一个变量地址,但是却没有一个变量名与之对应。这样也有好处,在链表的学习中,并不需要每个节点都有名字,所以用malloc函数申请空间还是极为合理的。
总结,以上是我对指针学习进行的总结,仅代表我的个人看法,如果我的说法有错误,欢迎指出。
希望以上内容对你的生活和学习有所帮助。