秋栈博客

七月

指针与数组名

6
2021-11-04

区别一:

数组名取地址得到的是数组名所指元素的地址。 对指针取地址得到的是指针变量自身的地址。

区别二:

数组是固定大小的,数组一经定义,那么数组名就是一个指向数组首元素类型的常量指针,也就是说数组名是不允许更改的,而指针可以更改。 数组名是常量指针,指针是变量指针。

区别三:

当对数组名使用sizeof时,得到的是数组元素的个数乘元素类型的字节数,对指针sizeof得到的是指针类型的字节数。

代码

#include 
int main()
{
    int arr[3] = {1, 2, 3};
    int *p = arr;
    printf("数组长度为:%d\n", sizeof(arr)); //结果:12  三个元素X四个字节
    printf("数组长度为:%d\n", sizeof(p));   //结果:8   操作系统用8个字节表示一个地址
    printf("整型长度为:%d\n", sizeof(int)); //结果:4   int型的四字节

    printf("指针长度为:%d\n", sizeof(int *));  //结果:8   任一指针 8字节代表一个地址
    printf("指针长度为:%d\n", sizeof(char *)); //结果:8   任一指针 8字节代表一个地址
    // printf("%d ",*p);     //写法3
    // printf("%d",p[0]);    //写法2
    // printf("%d ",*arr);   //写法3

    for (int i = 0; i < 3; i++)
    {
        // printf("%d ",*(p+i));    //写法1
        // printf("%d ",*(arr+i));  //写法2
        // printf("%d ",*p++);      //写法3
        // printf("%d",*arr++);     //编译出错:p为存放地址的指针变量,arr是常量,地址不变。
    }

    return 0;
}

总结

1.数组名代表了一个指向数组首元素的常量指针,一经定义,不可更改,数组名作为常量指针,其类型与数组元素类型相同。指针是变量指针,定义之后仍可更改,其类型在定义时确定。 2.当出现sizeof,和&操作符时,数组名不再当成指向一个元素的常量指针来使用,而指针仍当成指向一个元素的变量指针来使用。

指针和数组下标的选择

系统在使用数组下标对数组成员变量进行访问时,开销比较大,指针的访问效率是远远大于数组名的访问效率的。但是只有在指针正确访问时,才成比下标法更有效率。下标法更加容易理解,在可读性方面,也更加的具有优势。
  • 0