变量和内存
- 内存用于存储数据,最小的单元是字节,每个单元都有一个地址编号,从0X0000000~0XFFFFFFFF
- 变量有大小,指的是在内存占了几个字节。
- 变量有地址,是变量在内存的位置,用&号可以取得地址。
- 变量赋值,就是向内存写入数据。读变量的值,就是从内存读取数据。
- 每个变量都有自己的内存地址,绝不会有两个变量的地址相同。
- 程序每次运行时,变量的地址是不一样的,无法预测与不需要预测
查看变量地址
地址是一个整数: 0x00000000 ~ 0xFFFFFFFF
int a = 0;
double b = 0;
printf(“%08X \n”, &a);
printf(“%08X \n”, &b);
也可以
printf(“%p \n”, &a); // p: pointer
如何表示地址?
地址是整数,是否可以用 int ? (理论上可以。。。)
但是为了强调它是个内存地址,提出一些新的类型。。。
char* : 表示一个char型变量的地址
short* : 表示一个short型变量的地址
int* : 表示一个int型变量的地址
float* : 表示一个float型变量的地址
double*: 表示一个double型变量的地址
unsigned char*: 表示一个unsigned char型变量的地址
...
XXX* : 表示XXX型变量的地址
以下以int型变量为例:
int a = 10;
int* pa = &a;
定义一个变量pa,类型为int*,初始值为&a。
有两种叫法:
pa指向了一个int型变量
pa所在的内存是一个int型整数
我们称int*为指针类型,pa为指针类型的变量(简称指针)
关于指针
1指针也是变量,是可以变的。可以把它视为一种整型变量。
int a=10;
int b=11;
int* p=&a;
p=&b;
2 不同类型的指针,不能互相赋值
int a = 10;
int* pa = &a; // pa: int*型
double* pb = pa; // 错!! 左侧double*, 右侧int*
(int*: 指向int型变量, double*:指向double型变量,肯定不能互相赋值)
又如:
char a = 78;
float* p = &a; //错:左侧为float*,右侧为char*
3指针即地址,地址是整数,所以指针是一个整数类型
int a ;
int* p = &a;
printf(“addr: %08X \n”, p);
也可以使用 “%p”,效果和%X差不多
printf(“addr: %p\n”, p);
- 星号的位置,均可
int* a;
int * a;
int *a;
- 星号操作:按地址访问
已知一个int型变量
1直接使用变量名来赋值
int a=10;
a=11;
2使用指针(按地址访问,直接修改内存)
int a=10;
int* pa=&a;//pa指向a
*pa=0x11;
*pa=0x1314;
3区分指针定义语句中的*和按地址访问的*
int a = 10;
int b = 11;
int* p ; // 定义一个指针, 注意int*作为一个整体
p = &a; // p指向a
printf(“ %d \n”, *p); // *p: 取得p处内存的值
p = &b; // p指向b
printf(“%d \n”, *p); // *p: 取得p处内存的值
只有指针才能支持*操作
4有一个指针变量p,则*p用于访问p指向的变量(p指向的内存)。
或者称作:*p用于访问p指向的内存(读、写)
int a = 0x1314;
int* p = &a; // p指向a所在的内存
*p += 2;
--------------------------
int b = *p; // 取得p指向内存的值
int c = *p + 2;
5其他指针类型的用法也是完全一样的。
char a = 78;
char* p = &a;
*p = 79;
----------------
double m = 1.1;
double* pm = &m;
*pm = 1.2
...完全一样
小结
- 提出新的类型char* int* double*...用于表示某型变量的地址
- 学习按地址访问:星号操作