有问题未解决(9.28)
#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;//0x0000004DD7AFFBE4
int 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);8
printf("%p\n", &a);4
printf("%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,和指针类似,一般情况下,指针的类型要和传过去的地址的类型一样