栈的属性和数组地址的增长方向_栈向下增长数组指针加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低。但是数组由于本身的特性,下标大的反而会比下标小的地址更高,不受栈开口方向影响。
并且如果当我们改变定义指针变量和定义数组的顺序变化的时候,这个时候先定义的地址会处于地址高的地方,后定义的地址会低