#include <stdio.h> int main()
{int a = 1;int b = 2;int c = 3;int arr[] = { a,b,c };arr[0] = 10;printf("%d\n", a);//打印结果为1;return 0;
}
颠覆认知了,或许也没有颠覆
arr是一个int类型的数组,他存的就是一个数,而不是变量,a的地址和arr的地址并不一样
char arr1[] = "hello bit";
printf("%c\n", *arr1);//h
printf("%c\n", *(arr1+1));//e
数组名+1,就是下一个元素的地址,int类型的数组名+1移动四个字节,char类型的数组名+1移动1个字节,数组的类型决定了数组名+1移动的距离
二维数组的数组名代表什么?
把二维数组想象成一维数组,二维数组的数组名代表的就是第一行的地址
不要写成 int* arr[3] = { &a,&b,&c };这个地方写成&a会有什么结果目前不确定,有待商榷
鹏哥之前讲过打印二维数组的多种形式,但是我忘了
a数组,b数组,c数组是独立的,并且不是连续的,只不过通过指针数组跳跃地将它们访问
#include <stdio.h> int main()
{int a = 1;//0x0000004DD7AFFBC4//int类型是四个字节,32个比特位,a的地址加上32正好到b//错了,a和b并不是两个相邻的整型变量,真正相邻的整型变量的地址相差应该是4,// 一个字节代表一个地址,而不是一个比特位代表一个地址int b = 2;//0x0000004DD7AFFBE4int c = 3;int arr[] = { a,b,c };//char arr1[] = "hello bit";//printf("%c\n", *arr1);//h//printf("%c\n", *(arr1+1));//e//printf("%p\n", arr1);//printf("%p\n", &arr1[0] + 1);/* int a[] = {1,2,3,4,5};int b[] = {2,3,4,5,6};int c[] = {3,4,5,6,7};*//* int a = 0;int* p = &a + 1;printf("%p\n", p);8printf("%p\n", &a);4printf("%p\n", &a + 1);8*///a的地址是4,&a+1后的结果是8而不是5,说明变量的类型,会影响变量地址加减时的步长return 0;
}
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
int(*pa)[10] = &a;
printf("%p\n", pa);//pa相当于&a
printf("%p\n", *pa);//*pa相当于a,即数组名
&arr的步长是40,所以需要一个步长类型为40的指针来接收
数组名是首元素的地址,arr2的首元素类型是一级指针,一级指针的地址要放到二级指针里面,实际上,arr2就是一个二级指针
[5]之所以不能省略是因为arr的类型是int[5],它的步长是5,和指针类似,一般情况下,指针的类型要和传过去的地址的类型一样