1.sizeof(数组名)与&数组名
在C语言中,一维数组名大多数情况等效于数组首元素地址。但有两个特例,sizeof(数组名)与&数组名。在这两个特例中数组名代表的是整个数组。
1. int arr[10]={1,2,3,4,5,6,7,8,9,10}; 2. printf("%d",sizeof(arr));//4*10=40
我们知道数组名是首元素地址,所以可以用一个指针存放
1. int arr[10]={1,2,3,4,5,6,7,8,9,10}; 2. int* p=arr;//存放首元素地址 3. //等价于int* p=&arr[0];
那么&数组名该存放到什么类型的指针呢?这里引出数组指针,是专门存放整个数组地址的一种指针。可以这样使用
1. int arr[3]={1,2,3}; 2. int (*p)[3]=&arr;
2.一维数组传参
一维数组传参本质是传地址,但也可以直接在形参位置放同类型数组,例如
1. #include<stdio.h> 2. void print(int arr[3], int sz) 3. { 4. int i = 0; 5. for (i = 0; i < sz; i++) 6. { 7. printf("%d ", arr[i]); 8. } 9. 10. } 11. int main() 12. { 13. int arr[3] = { 1,2,3 }; 14. print(arr, 3); 15. return 0; 16. }
这样可以很好的访问到一维数组。 下面也可以用指针来传参、访问
1. #include<stdio.h> 2. void print(int* arr, int sz) 3. { 4. int i = 0; 5. for (i = 0; i < sz; i++) 6. { 7. printf("%d ", *(arr+i)); 8. } 9. 10. } 11. int main() 12. { 13. int arr[3] = { 1,2,3 }; 14. print(arr, 3); 15. return 0; 16. }
这样就体现出了一维数组 数组名是首元素地址的问题了。
3.二维数组传参
二维数组传参也可以直接在形参位置放二维数组,例如
1. #include<stdio.h> 2. void print(int arr[3][4], int x, int y) 3. { 4. int i = 0; 5. int k = 0; 6. for (i = 0; i < x; i++) 7. { 8. for (k = 0; k < y; k++) 9. { 10. printf("%d ", arr[i][k]); 11. } 12. printf("\n"); 13. } 14. } 15. int main() 16. { 17. int arr[3][4] = { 1,2,3,4, 2,3,4,5, 3,4,5,6 }; 18. print(arr, 3, 4); 19. return 0; 20. }
其实二维数组传参的本质是传数组指针。因为对于二维数组来说,数组名代表首行地址
数组维数 | 一维数组 | 二维数组 |
数组定义 | int arr[] | int arr[][] |
数组名 | arr | arr |
数组名等价 | &arr[0] | &arr[0] |
含义 | 首元素地址 | 首行地址 |
int arr[3][4];
此时arr[0]代表的就是二维数组的第一行的地址,地址指向二维数组的第一行,是一种指针,即数组指针。
由此可知,二维数组传参的指针形式就是传一个数组指针,即形参是数组指针类型,代码如下
1. #include<stdio.h> 2. void print(int (*arr)[4], int x, int y) 3. { 4. int i = 0; 5. int k = 0; 6. for (i = 0; i < x; i++) 7. { 8. for (k = 0; k < y; k++) 9. { 10. printf("%d ",*(*(arr+i))+k); 11. } 12. printf("\n"); 13. } 14. } 15. int main() 16. { 17. int arr[3][4] = { 1,2,3,4, 2,3,4,5, 3,4,5,6 }; 18. print(arr, 3, 4); 19. return 0; 20. }