目录
1.数组的地址
2.通过指针访问数组
3.数组和指针的不同点
4.指针数组
1.数组的地址
数组的地址是什么?
看下面一组代码
#include <stdio.h>
int main()
{
int arr[5] = {5,4,3,2,1};
printf("&arr[0] = %p\n", &arr[0]);
printf("arr = %p\n", arr);
return 0;
}
运行结果:
从上面代码中可以看到数组名和首元素的地址和是一样的
但是有不同的情况
举例:
#include <stdio.h>
int main()
{
int arr[6] = { 5,4,3,2,1,0 };
printf("&arr[0] = %p\n", &arr[0]);
printf("&arr[0]+1 = %p\n\n", &arr[0]+1);
printf("arr = %p\n", arr);
printf("arr+1 = %p\n\n", arr+1);
printf("&arr = %p\n", &arr);
printf("&arr+1 = %p\n\n", &arr+1);
return 0;
}
运行结果
可以看到当对&arr[0],arr,&arr都+1时,&arr[0]和arr都移动了4个字节,而&arr移动了16个字节也就是整个数组的长度。
实际上除了&数组名表示整个数组的地址,在使用sizeof(数组名)计算数组的字节数时时,sizeof中的数组名表示的也是整个数组的地址。
总结:数组名表示的是数组首元素的地址,但有两个例外:
1.&数组名
这里的数组名实际上表示的是整个数组的地址
2.sizeof(数组名)
这里的数组名也表示整个数组的地址,计算的是整个数组的字节数。
2.通过指针访问数组
#include <stdio.h>
int main()
{
int arr[5] = { 0,1,2,3,4, };
int i = 0;
int n = 100;
int* p = arr;
for (i; i < 5; i++)//通过指针p给数组重新赋值
{
*p = n;
n++;
p ++;
}
for (i = 0; i < 5; i++)//打印数组每个元素
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果:
可以看到数组的值可以通过指针被改变
把代码稍作修改:
#include <stdio.h>
int main()
{
int arr[5] = { 0,1,2,3,4, };
int i = 0;
int n = 100;
int* p = arr;
for (i; i < 5; i++)//通过指针p给数组重新赋值
{
*p = n;
n++;
p++;
}
for (i = 0; i < 5; i++)//打印地址
{
printf("&arr[i] =%d\np+i =%d\n", &arr[i],p+i);
}
return 0;
}
运行结果:
可以看到arr[i]的地址就是指针变量p+1的地址,这也是通过指针更改变数组的每一个元素的原因
3.数组和指针的不同点
int arr[10];
int * p = arr:
p = arr;
//ok
当给p进行赋值时程序会正常执行
int arr[10];
int brr[10];
arr = brr;
//err
当给函数名赋值时程序会报错
总结:赋值表达式的左操作数不能是数组名,但可以是指针变量。
4.指针数组
指针数组就是存放指针的数组
例如:
#include <stdio.h>
int main()
{
int a = 0;
int* p = &a;
int* pp = &a;
int* ppp = &a;
int arr[3] = { *p,*pp,*pp };
printf("%d %d %d\n", arr[0], arr[1], arr[2]);
return 0;
}
运行结果:
通过上面的代码可以看到通过指针数组的元素,也能访问到指针指向的变量。
注意:指针数组是数组,而数组指针是指针
指针数组是存放指针的数组,数组指针是指向数组的指针。