指针概念
数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。
下图是 4G 内存中每个字节的编号(以十六进制表示):
我们将内存中字节的编号称为地址(Address)或指针(Pointer)。地址从 0 开始依次增加,对于 32 位环境,程序能够使用的内存为 4GB,最小的地址为 0,最大的地址为 0XFFFFFFFF。
下面的代码演示了如何输出一个地址:
#include <stdio.h>
int main(){
int a=100;
char str[20]="Hello World!";
printf("a的内存地址:%#X\n",&a);
printf("str的首内存地址:%#X",str);
return 0;
}
//运行结果:
//a的内存地址:0X62FE1C
//str的首内存地址:0X62FE00
注:
%#X表示以十六进制形式输出,并附带前缀0X。a 是一个变量,用来存放整数,需要在前面加&来获得它的地址;str 本身就表示字符串的首地址,不需要加&。 | |
---|---|
CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。
假设变量 a、b、c 在内存中的地址分别是 0X1000、0X2000、0X3000,那么加法运算c = a + b;将会被转换成类似下面的形式:
0X3000 = (0X1000) + (0X2000);
( )表示取值操作,整个表达式的意思是,取出地址 0X1000 和 0X2000 上的值,将它们相加,把相加的结果赋值给地址为 0X3000 的内存
变量名和函数名为我们提供了方便,让我们在编写代码的过程中可以使用易于阅读和理解的英文字符串,不用直接面对二进制地址。
指针定义和赋值
- 定义一个指针变量
#include <stdio.h>
int main(){
//指针类型 *指针变量名 ;
//短整型指针变量
short *p2;
//长整型指针变量
long *p3;
//整型指针变量
int *p4;
//双精度指针变量
double *p5;
//字符指针变量
char *p6;
return 0;
}
2.给指针赋值(指针变量存储的是地址,即给指针变量赋地址)
#include <stdio.h>
int main(){
int a=0;
//定义一个指针,定义时赋值:
int *p=&a;
//先定义,后赋值
int *p1;
p1=&a;
return 0;
}