我们都知道指针在计算机中占有很重要的部分,但指针究竟是什么呢?有人说:指针就是地址,因为指针都是指向一个地址空间的,。这么说也没毛病,但不准确。
例如: int a=10; int * p=a; 很显然指针变量p中所存的是&a,不过这只是指针变量的一部分,是指针变量作为左值的表现,还有指针变量作为右值的呢,那么p表示的就是指针内容了。
不过在地址空间中也有不同的区域,请看下图:
这里重点介绍一下堆区和栈区。
堆和栈是相对而生的,如图所示,栈向下,堆向上。也就是说,存储时,如果在栈中,那么地址是由高到低存的,在堆中,那么地址是由低到高存的,要是不信,请看下面的代码:
#include<stdio.h>
#include<stdlib.h>
int g_val=10;
static int gs_val=20;
int main()
{
int a,b,c;
int arr[100];
char*msg="hello bit";
char str[]="hello bit";
int*adr=(int*)malloc (10*sizeof(int));
int*adr1=(int*)malloc (10*sizeof(int));
printf("code:%p\n",main);
//printf("static global val:%p,%p\n"&g_val,&gs_val);
printf("heap:%p~%p\n",adr,adr+9);
printf("heap:%p~%p\n",adr1,adr1+9);
printf("stack:%p,%p,%p\n",&a,&b,&c);
printf("stack array:%p~%p\n",arr,&arr[99]);
printf("msg:%p,&msg:%p\n",msg,&msg);
printf("%c->%p\n",str[0],str);
printf("%c->%p\n",str[9],&str[9]);
free(adr);
free(adr1);
return 0;
}
下面请看结果:
我们来看一下,heap表示的是堆区,在堆区中的分别是:002F1B98~002F1BBC和002F1BF0~002F1C14,可以看出两个都是由低到高的,;同样的,来看在栈中的a,b,c地址就是由高到低的,这就堆和栈的相对性,接下来看array,我们发现在栈所分配的数组中还是由低到高的,可以看出,分配地址时,是先给整个数组分配,再在数组中分配。
最后再说一点,地址空间和物理内存完全不一样。