C语言基础知识点(十三)编译器中变量内存储存

栈的属性和数组地址的增长方向_栈向下增长数组指针加1-CSDN博客

今天在看C语言基础知识点时遇到一个很有趣的问题,我们先看一眼代码

#include <stdio.h>

int main()
{

    int urn[5] = {
        2, 4, 3, 2, 2};
    int *ptr1, *ptr2;
    ptr1 = &urn[0];
    ptr2 = &urn[1];
    printf("&urn[4]=%p\n", &urn[4]);
    printf("&urn[3]=%p\n", &urn[3]);
    printf("&urn[2]=%p\n", &urn[2]);
    printf("&urn[1]=%p\n", &urn[1]);
    printf("&urn[0]=%p\n", &urn[0]);

    printf("ptr1的值:%p,&ptr1的地址:%p\n", ptr1, &ptr1); // 
    printf("ptr2的值:%p,&ptr2的地址:%p\n", ptr2, &ptr2);

    printf("sizeof(ptr1):%d\n", sizeof(ptr1));
    printf("sizeof(ptr2):%d\n", sizeof(ptr2));
    return 0;
}

我们可以看到,在该编译器中栈的开口往下,地址由高往低生长,先在高的地址存放放进来的变量,再到低的地址存放后放进来的变量。就好像指针变量ptr2的地址比ptr1低。但是数组由于本身的特性,下标大的反而会比下标小的地址更高,不受栈开口方向影响。

并且如果当我们改变定义指针变量和定义数组的顺序变化的时候,这个时候先定义的地址会处于地址高的地方,后定义的地址会低

猜你喜欢

转载自blog.csdn.net/qq_51519091/article/details/136808952