学习c语言指针,针对数组以及指针的关联及区别进行了理解,为防止忘记,记录一下。
一维数组的指针
#include <stdio.h>
int main()
{
int array[] = {1,2,3,4};
int *p = NULL;
p = &array[0];
printf("address of pointer p : %p\n", p);
printf("address of array : %p\n", array);
printf("address of &array : %p\n", &array);
printf("address of p+1 : %p\n", p+1);
printf("address of array+1 : %p\n", array+1);
printf("address of &array+1 : %p\n", &array+1);
printf("value of *p : %d\n", *p);
printf("value of *array : %d\n", *array);
printf("value of *p+1 : %d\n", *p+1);
printf("value of *array+1 : %d\n", *array+1);
return 0;
}
根据运行结果显示,指针变量p与数组名array的内存地址均位数字第一个数据的内存地址,但是在对它们加1后,所得的结果稍有差异,其中“p+1”和“array+1”的结果是数组第2位的地址,而“&array+1”的地址为跳过array4个数据之后的地址(5000h-4ff0h=10h=16=4*4(4个int地址长度))。
二维数组的指针
#include <stdio.h>
int main()
{
int (*p)[4] = NULL;
int array[][4] ={{1,2,3,4},{11,22,33,44},{111,222,333,444}};
p = array;
printf("address of pointer p : %p\n", p);
printf("address of array : %p\n", array);
printf("address of p[0]+1 : %p\n", p[0]+1);
printf("address of array[0]+1 : %p\n", array[0]+1);
printf("address of p+1 : %p\n", p+1);
printf("address of array+1 : %p\n", array+1);
printf("address of &array : %p\n", &array);
printf("address of &array+1 : %p\n", &array+1);
printf("address of &array+1+1 : %p\n", &array+1+1);
printf("value of **p : %d\n", **p);
printf("value of **array : %d\n", **array);
printf("value of **p+1 : %d\n", **p+1);
printf("value of *(*p+1) : %d\n", *(*p+1));
printf("value of **array+1 : %d\n", **array+1);
printf("value of *(*(p+1)+1) : %d\n", *(*(p+1)+1));
printf("value of *(p[1]+1) : %d\n", *(p[1]+1));
printf("value of *(*(array+2)+1) : %d\n", *(*(array+2)+1));
printf("value of *(array[2]+1) : %d\n", *(array[2]+1));
return 0;
}
首先说明一下二维数组的格式,array[a][b]中,第一位索引可以为空,第二及以后必须定义长度,array[a][b]定义了一个a(行)*b(列)的数组,引用一张图片:
在内存中,二维数组也是以连续的地址进行存放,先依次存放a[0]的所有数据,其次是a[1],直到最后。
二维数组的内存地址可以参考一维数组进行分析。二维数组数据的引用需要使用**进行调用,[a]和[b]的调用要放在小括号()内。需要注意一点,在变量定义的时候,开始并没有定义二维数组指针变量的长度,即int (*p)[] = NULL;,这样在进行数据调用时,导致编译报错,所以必须要指定二维数组指针的长度才可以。
自己感觉,根据这两个形式比较好理解,即一维数组数据a = *(p+1),二维数组数据即在一维基础上增加一个维度,b = *(a+1) = *(*(p+1)+1)。
printf("value of *(p+1) : %d\n", *(p+1)); /*一维数组*/
printf("value of *(*(p+1)+1): %d\n", *(*(p+1)+1)); /*二维数组*/
虽然稍微理解了数组指针的大概形式,但是发现运行中,指针和数组名的作用是一样的,也就是说数组名其实也是一个指针类型,那这样的话,为数组定义指针的意义在哪里呢?