赞
踩
各位小伙伴们,我们继续来学习指针,指针和结构体以及动态内存管理对后面的数据结构学习有非常大的帮助,所有我们一定要把这些知识点学会。OK,正式进入学习之旅吧
- int arr[10] = {1,2,3,4,5,6,7,8,9,10};
- int *p = &arr[0];
- int main()
- {
- int arr[10] = { 0 };
- printf("%p\n", &arr[0]);
- printf("%p\n", arr);
-
- return 0;
- }
- int main()
- {
- int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
- printf("%d\n", sizeof(arr));
- return 0;
- }
2.&数组名,这⾥的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素的地址是有区别的)。
- int main()
- {
- int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
- printf("&arr[0] = %p\n", &arr[0]);
- printf("arr = %p\n", arr);
- printf("&arr = %p\n", &arr);
- return 0;
- }
奇怪的是三个代码的结果一模一样,那么arr和&arr区别在哪?
我们可以看一下这段代码,就知道数组首元素的地址和整个数组的地址到底是怎么回事了
- int main()
- {
- int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
- printf("&arr[0] = %p\n", &arr[0]);
- printf("&arr[0]+1 = %p\n", &arr[0]+1);
-
- printf("arr = %p\n", arr);
- printf("arr+1 = %p\n", arr+1);
-
- printf("&arr = %p\n", &arr);
- printf("&arr+1 = %p\n", &arr+1);
-
- return 0;
- }
- int main()
- {
- int arr[10] = { 0 };
- int sz = sizeof(arr) / sizeof(arr[0]);
- int* p = arr;
- int i = 0;
- for (int i = 0; i < sz; i++)
- {
- scanf("%d", p + i);
- //scanf("%d", arr+i);//也可以这样写
- }
- for (i = 0; i < sz; i++)
- {
- printf("%d ", *(p + i));
- }
- return 0;
- }
- void test(int arr[])
- {
- int sz = sizeof(arr) / sizeof(arr[0]);
- printf("%d", sz);
- }
-
- int main()
- {
- int arr[10] = { 0 };
- test(arr);
- return 0;
- }
结果是1,这是因为数组传参的时候,传递的并非是数组,而是是首元素的地址,传地址要用指针来接收。在x86环境下,int类型的指针变量大小是4个字节,一个元素的大小是4,所以结果是1。
值得注意的是实际上并非完全是⼆维数组,因为每⼀行并非是连续的。
- int main()
- {
- int arr1[] = { 1,2,3,4,5 };
- int arr2[] = { 2,3,4,5,6 };
- int arr3[] = { 3,4,5,6,7 };
-
- int* arr[3] = { arr1,arr2,arr3 };
-
- int i = 0;
- for (i = 0; i < 3; i++)
- {
- int j = 0;
- for (j = 0; j < 5; j++)
- {
- printf("%d ", arr[i][j]);
- }
- printf("\n");
- }
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。