有问题未解决(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,和指针类似,一般情况下,指针的类型要和传过去的地址的类型一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值