c语言指针与数组
我们讨论一下c语言中的指针与数组的关系
通常我们定义一个数组的形式如下:
int A[5] = {2,4,6,8,10};
他的5个变量分别对应的值是
A[0] = 2,A[1] = 4,A[2] = 6,A[3] = 8,A[4] = 10
他们如果用图示表示出来则如下
数组元素 | A[0] | A[1] | A[2] | A[3] | A[4] |
---|---|---|---|---|---|
数组值 | 2 | 4 | 6 | 8 | 10 |
数组地址 | 100 | 104 | 108 | 112 | 116 |
上面表格表示数组元素在内存中的分布和示意,数组是一块连续的内存,相邻元素间的地址是连续的的,一个整形元素的大小是4个字节,A[1]的地址比A[0]的地址大4,依次递增,整个数组所占的空间大小是4*5=20byte
我们接下来定义一个整形变量int x和一个指针int *p,
int b = 5;//定义变量b
int *p;
p = &b;
我们知道*p的值为5,p的值为b的地址,如果我们想要知道b的下一个地址中的值,我们可以通过指针找到他的地址p+1和地址中的值 *(p+1)。
对于数组来说我们同样可以这样来操作
int A[5] = {2,4,6,8,10};
int *p;
p = &A[0];//取数组A的首地址
这样我们就可以通过指针得到数组A的起始地址和首元素,p对应的就是A的首地址,*p对应的是A[0],数组的首个元素值为2,下面我们用代码来演示操作一下。
#include <stdio.h>
int main()
{
int A[5] = {2,4,6,8,10};
int *p;
p = &A[0];
printf("&A[0] = %d,A[0] = %d\n",&A[0],A[0]);
printf("p = %d,*p = %d\n",p,*p);
return 0;
}
打印出来的结果指针p指向的数组A的首地址
如果我们想得到下一个元素同样可以操作指针得到
p = p+1;//指向数组的下一个元素地址
*p = *(p+1);//得到下一个元素的值
通过代码依次打印数组的地址和值
#include <stdio.h>
int main()
{
int A[5] = {2,4,6,8,10};
int *p;
int i = 0;
p = &A[0];
for(i = 0;i<5;i++)
{
printf("&A[i] = %d,A[i] = %d\n",&A[i],A[i]);
printf("p+%d = %d,*(p+%d) = %d\n",i,p+i,i,*(p+i));
}
return 0;
}
打印结果如下,可以看出通过指针操作和数组索引得到的值是一样的
这里p=&A[0],也可以写成p = A;A代表的也是数组的首地址,我们打印一下看看
#include <stdio.h>
int main()
{
int A[5] = {2,4,6,8,10};
int *p;
int i = 0;
p = A;
printf("&A[0] = %d,A = %d\n",&A[0],A);
for(i = 0;i<5;i++)
{
printf("&A[i] = %d,A[i] = %d\n",&A[i],A[i]);
printf("p+%d = %d,*(p+%d) = %d\n",i,p+i,i,*(p+i));
}
return 0;
}
打印出来&A[0]和A的值一样