A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

三、指针与数组的总结
p是指针,a是一个数组
1> 如果p指向了一个数组元素,则p+1表示指向数组该元素的下一个元素。比如,假设p = &a[0],则p+1表示a[1]的地址
2> 对于不同类型的数组元素,p值的改变是不同的。如果数组元素为int类型,p+1代表着p的值加上2(16位编译器环境下)
3> 如果p的初值是&a[0],那么
p+i和a+i都可以表示元素a[i]的地址,它们都指向数组的第i个元素。a代表数组首地址,a+i也是地址,它的计算方法与p+i相同
*(p+i)和*(a+i)都表示数组元素a[i]
虽然p+i和a+i都指向数组的第i个元素,但二者使用时还是有区别的。因为作为指针变量的p可以改变自身值,如p++,使p的值自增。而数组名a是一个代表数组首地址的常量,它的值是不能改变的,即a++是不合法的
4> 引用一个数组元素可以有两种方法:
下标法: 如a[i]
指针法: 如*(p+i) 或 *(a+i)
回到顶部
四、数组、指针与函数参数
1.用数组名作为函数实参时,是把实参数组的首地址传递给形参数组,两个数组共同占用同一段内存空间,这样形参数组中的元素值发生变化就会使实参数组的元素值也同时变化
复制代码
1void change(int b[]) { 2 b[0] = 10; 3} 4 5int main() 6{ 7// 定义一个int类型的数组 8int a[4] = {1, 2, 3, 4}; 910// 将数组名a传入change函数中11 change(a);1213// 查看a[0]14 printf("a[0]=%d", a[0]);1516return0;17 }
复制代码
change函数的形参是数组类型的,在第11行调用change函数时,将数组名a,也就是数组的地址传给了数组b。因此数组a和b占用着同一块内存空间。
输出结果:
2.这种地址的传递也可以用指针来实现。函数的实参和形参都可以分别使用数组或指针。这样就有4种情况:

也就是说,如果一个函数的形参类型是一个数组,调用函数时,你可以传入数组名或者指针变量;
复制代码
1void change(int b[]) { 2 b[0] = 10; 3} 4 5int main() 6{ 7// 定义一个int类型的数组 8int a[4] = {1, 2, 3, 4}; 910int *p = a;1112// 将数组名a传入change函数中13 change(p);1415// 查看a[0]16 printf("a[0]=%d", a[0]);1718return0;19 }
复制代码
注意第1行的形参类型是个数组int b[],第10行定义了指针变量p,第13行将p当做实参传入函数
如果一个函数的形参类型是一个指针变量,调用函数时,你可以传入数组名或者指针变量。
复制代码
1void change(int *b) { 2 b[0] = 10; 3// 或者*b = 10; 4} 5 6int main() 7{ 8// 定义一个int类型的数组 9int a[4] = {1, 2, 3, 4};1011// 将数组名a传入change函数中12 change(a);1314// 查看a[0]15 printf("a[0]=%d", a[0]);1617return0;18 }
复制代码
注意第1行的形参类型是个指针变量int *b,第12行将数组名a当做实参传入函数。
由第2行可以看出,在很多情况下,指针和数组是可以相互切换使用的。但是,并不能说指针就等于数组。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马