一.数组的指针
1.数组的指针也就是数组的地址,数组的指针在数字上面等价于数组第一个元素的指针。
比如:int a[5]; 数组的地址 == &a[0];
2.数组名的本质
int a[5];
- 数组名a 代表数组这种数据类型
- 数组名a 表示数组首元素的指针,a 是一个指针常量
数组的地址 == &a[0] = a;
3.数组的另外一种遍历方式
int main(int argc, const char * argv[]) {
int a[] = {1,2,3,4,5,6};
int len = sizeof(a)/sizeof(a[0]);
//下标法
for (int i = 0; i < len; i ++)
printf("%d ", a[i]);
printf("\n");
//打印1,2,3,4,5,6
//指针来遍历数组元素
for (int i = 0; i < len; i ++)
printf("%d ", *(a + i));
printf("\n");
//打印1,2,3,4,5,6
return 0;
}
二.指向数组的指针变量
1.概念:定义一个指针变量,该指针变量保存数组的地址,那么将该指针变量叫做指向数组的指针变量。
2.声明方式
int a[5] = {1,2,3,4,5};
int *p = a;
3.数组指针变量作用
访问指针变量所指向的存储区域。另外,指针变量和一般变量一样,存放在它们之中的值是可以改变的,也就是说可以改变它们的指向。简单来说就是取值和修改值。
int main(int argc, const char * argv[]) {
int a[5] = {1,2,3,4,5};
// 指针变量p指向a
int *p = a;
//访问指针变量所指向的存储区域
printf("*p = %d\n", *p);//*p = 1
// 通过指针变量p间接修改变量a的值
*p = 9;
printf("修改后,a的值:%d\n", a[0]);//修改后,a的值:9
return 0;
}
4.如何通过指向数组的指针变量 p 来操作数组
1.如何获取数组元素和数组原属的地址
数组元素的地址:
&a[i], a + i, &p[i], p + i
数组元素:
a[i], *(a + i), p[i], *(p + i)
int main(int argc, const char * argv[]) {
int a[5] = {1,2,3,4,5};
int *p = a;
//数组元素的地址
printf("&a[1] = %p\n,a + 1 = %p\n,&p[1] = %p\n, p + 1 = %p\n", &a[1],a + 1,&p[1],p + 1 );
//数组元素
printf("a[1] = %d\n,*(a + 1) = %d\n,p[1] = %d\n, *(p + 1) = %d\n", a[1],*(a + 1),p[1],*(p + 1));
/***
&a[1] = 0x7ffeefbff4b4
,a + 1 = 0x7ffeefbff4b4
,&p[1] = 0x7ffeefbff4b4
, p + 1 = 0x7ffeefbff4b4
a[1] = 2
,*(a + 1) = 2
,p[1] = 2
, *(p + 1) = 2
****/
return 0;
}
5.数组名和数组指针变量的区别?
数组名是一个常量,一旦数组定义了,那么数组的指针不能在更改。而数组指针变量,是一个变量,可以被反复的赋值。
int main(int argc, const char * argv[]) {
int a[5] = {1,2,3,4,5};
int b = 10;
int *p = a;
p = &b;//不会报错,数组指针变量p,是一个变量,可以被反复的赋值
// a = &b;//会报错,a是一个常量,值是a[0]的地址,常量不能修改
printf("p[0] = %d\n", p[0]);//10
return 0;
}
三、数组、指针变量与函数参数
1.数组作为参数的表示方式
数组作为参数传递:
形参 实参
1: 数组 int a[] 数组名 arr
2: 数组 Int a[] 数组指针变量 p
3: 指针 int *a 数组名 arr
4: 指针 int *a 数组指针变量 p
void printArr(int a[], int len);
void printArr(int *a, int len);
int main(int argc, const char * argv[]) {
int arr[5] = {6,7,8,9,0};
int b[10] = {1,2,3,4,5,6,7,8,9,10};
printArr(arr, 5);//实参数组名 arr
printArr(b, 10);
return 0;
}
//a是数组的地址,是指向数组的指针变量
void printArr(int *a, int len)//形参 指针 int *a
//void printArr(int a[], int len)
{
//printf("size(a) = %lu\n", sizeof(a)); //40B?
for (int i = 0; i < len; i ++)
{
printf("%d ", a[i]);
}
printf("\n");
}
2.数组作为参数传递
1)本质
传递的是数组的首地址,因为传递的是数组的地址,所以不知道数组的长度。
2)完整的参数列表
数组的地址, 数组长度
(int *a, int len)
3) 数组能不能进行值传递,传递地址的好处。
数组只能进行地址传递。
传递地址有什么好处:
1)减少时间的浪费;
2)减少空间的浪费。