鸣涧 发表于 2023-9-12 17:03:45

【C语言】指针与数组名见怪不怪的写法,他们之间的区别

【C语言】指针与数组名见怪不怪的写法,他们之间的区别

指针当数组名,下标法访问
经常我们在一些地方我们也可以看到类似的代码,能看到声明了一个数组变量和指针变量,指针变量指向了数组首地址,但是在通过指针访问数组时却是用的数组下标法来进行访问的。以下我们来做个简单的例子:
// 指针指向数组时,指针变量可以当成一个数组来使用
#include <stdio.h>
int main()
{
    int arr = {1,2,3};
    int *p =arr;
    printf("%d\n",p);
    // 同样也能使用for循环来进行取值了
    for(int i = 0;i<3;i++){
      printf("%d\n",p);
    }
    return 0;
}
数组名当指针拿来加当我们用指针的方式拿数组数值时,我们是不是可以使用*p++来取下一个位置的值,那我们将*p++改成*arr++到底行不行,我们可以试试。// 指针指向数组时,指针变量可以当成一个数组来使用
#include <stdio.h>
int main()
{
    int arr = {1,2,3};
    int *p =arr;
    // 同样也能使用for循环来进行取值了
    for(int i = 0;i<3;i++){
      printf("%d\n",*p++);
    }
    for(int i = 0;i<3;i++){
      printf("%d\n",*arr++);
    }
    return 0;
}
通过编译结果我们发现,这样子是不行的,原因其实很简单,涉及到常量指针和指针变量的概念因为我们p 是一个指针变量,变量顾名思义就是可以存储可以变动的值。而p就是我们声明的一个指针变量,用于存放地址的变量。而数组,他是一个常量指针,数组名代表的就是数组开头的地址。不能通过自增偏移来跳到下一个地址。数组名与指针的区别接下来我们来观察一下用sizeof函数数组名与指针的区别。我们通过代码实验一下:#include <stdio.h>
int main()
{
    int arr = {1,2,3};
    int *p =arr;
    printf("sizeof arr is %d\n",sizeof(arr));
    printf("sizeof p is %d\n",sizeof(p));
    return 0;
}
结果我们可以看到虽然他们都是代表的同一个地址,但是通过sizefo得出的值却是不一样的。这是为什么呢。数组名的sizeof显示出12呢是因为数组里面有三个元素,每个元素4个字节,相乘等于12.而p的sizeof表示,用8个字节表示一个地址。他通过sizeof算出来的实际上效果与sizeof(int)算出来的结果是类似的。int的我们都知道一般是4个字节,当然不同编译器有点不同, int在16位编译器中占两个字节,int在32位编译器中占四个字节。对此我们可以推测,不论是int *还是char *型的指针,都是占8个字节,我们来实验看看:#include <stdio.h>
int main()
{
    int arr = {1,2,3};
    int *p =arr;
    printf("sizeof arr is %d\n",sizeof(arr));
    printf("sizeof p is %d\n",sizeof(p));
    printf("sizeof p is %d\n",sizeof(int *));
    printf("sizeof p is %d\n",sizeof(char *));
    printf("sizeof p is %d\n",sizeof(double *));
    return 0;
}运行结果如下:通过结果我们结论得到了验证。总结见怪不怪,指针可以当作数组名,通过下标法访问。数组名像指针一样拿来加也是可以的。但是在++时不行,还有在sizeof中他们所代表的含义也是不一样的。如果你希望我更新某个特定小知识,欢迎给我留言。
页: [1]
查看完整版本: 【C语言】指针与数组名见怪不怪的写法,他们之间的区别