美文网首页
数组与指针

数组与指针

作者: juriau | 来源:发表于2020-03-02 23:53 被阅读0次

    数组声明:int arr[] = {1, 2, 3, 4, 5};

    指向数组的指针

    指针可以指向数组,而且可以使用对指针的算术运算来代替数组的索引访问数组元素。
    如:int *p; p = &arr[0];

    此外,数组名其实就是指向数组第一个元素的指针,我们可以直接用数组名给指针赋值。
    如:int *p = arr;

    由此我们可以得到访问数组元素的方式:arr[i]、*(arr+i)、p[i]、*(p+i)

    数组名与指针

    数组名是指向数组中第一个元素的指针常量,不是指针变量,不能给数组名赋值或进行运算操作。

    比如,我们用对数组名和指向数组的指针分别使用sizeof(),立刻就能看到差别。

    int arr[] = {1, 2, 3, 4, 5};
    int *p = arr;
    printf("arr's size = %lu\n", sizeof(arr));
    printf("p's size = %lu\n", sizeof(p));
    

    结果:

    arr's size = 20
    p's size = 8
    Program ended with exit code: 0
    
    函数参数

    指向数组的指针*a和数组名a[]作为形式参数是等价的,都是指针,都可以进行赋值和运算。

    比如:我们用对它们分别使用sizeof(),我们发现它们此刻都是指针变量。

    void func(int *p){
        printf("%lu\n", sizeof(p));
    }
    
    void func2(int arr[]){
        printf("arr's size = %lu\n", sizeof(arr));
    }
    

    我们得到结果

    p's size = 8
    arr's size = 8
    Program ended with exit code: 0
    
    函数返回值

    我们来看下面两个例子:

    char *study(void)
    {
        char aa[20] = "I Want go home";
        return aa;
    }
    
    char *study2(void)
    {
        char *aa = (char *)malloc(30*sizeof(char));
        strcpy(aa, "I Want go home");
        return aa;
    }
    

    第一个会出现错误,而第二个没问题。

    第一个的错误在于,在函数内部创建一个数组,数组创建在内存的栈区域,函数完成后就会删除,这时候返回数组名 / 返回数组地址会出现错误,因为数组已经删除。

    而第二个用malloc动态分配内存创建数组,数组会创建在内存的堆区域,所以没有问题

    相关文章

      网友评论

          本文标题:数组与指针

          本文链接:https://www.haomeiwen.com/subject/yqzgkhtx.html