一.首先在谈指针之前,需要先说一下内存,程序在运行时内存分为如下几块:
栈:分配局部变量空间,存储临时变量,由操作系统分配回收。
堆:由程序员手动通过malloc/new分配,操作系统可能不会回收需要手动释放,否则会造成内存泄漏,malloc/free与new/delete要成对出现。
常量区:存放常量,比如字符串常量。
全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,该区域在程序结束后由操作系统释放。
代码区:由操作系统分配,对程序员来说是透明的,无法访问。
#include<stdio.h>
int a = 0;//全局区
int main()
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456在常量区,p3在栈上。
p2 = (char *)malloc(20); //堆
static int c =0; //全局(静态)区
return 0;
}
二.关于指针我们需要知道:
1. 指针变量也是一种变量,占有内存空间,用来保存内存地址
2. 指针与内存紧密相连,没有内存指针没有意义
3. 对指针的操作实际上是对内存间接操作
4. 指针变量和它指向的内存块是两个不同的概念
5. 指针是一种数据类型,取决于它所指向的内存空间的数据类型
#include<stdio.h>
int main()
{
int a=10;
int *p;
p=&a;
printf("a:%d\n",a);
printf("&a:%x\n",&a);
printf("p:%x\n",p);
printf("*p:%d\n",*p);
return 0;
}
运行结果如图:
代码内存如图:
由图我们可以看出p中存放的是a的地址,而并不是a的值,那么对*p的操作就是对a的操作
对于指针
- 在指针声明时,*号表示所声明的变量为指针
- 在指针使用时,*号表示 操作 指针所指向的内存空间中的值
- *p相当于通过地址(p变量的值)找到一块内存;然后操作内存
- *p放在等号的左边赋值(给内存赋值)
- *p放在等号的右边取值(从内存获取值)