1> 内存空间
内存空间4个属性:变量a
1>内存地址:0x0060FEFC;
2>内存大小:4Byte;
3>数据类型:int;
4>数据数值:1;
【0x0060FEFC】:
1>[变量a]第1字节,内存地址编号,
2>指向了a的整个4Byte空间;
这类型的数据,称为【指针】;
0x0060FEFC
地址为啥惯用16进制表示?
用十进制表示 6,356,732
1> 16进制表示数,更简短;
2> 前缀0x,与其他数据易区分;
? 0x0060FEFC 为什么指向的是
4Byte空间,而不是8Byte空间?
2> 指针类型 :Type *
0x0060FEE8
0x0060FEE0 指向8字节内存空间,
数据类型为 double;
------------------------
0x0060FEF8
0x0060FEF4 指向4字节内存空间,
数据类型为 int;
------------------------
0x0060FEFF
0x0060FEFE 指向1字节内存空间,
数据类型为 char;
------------------------
?问:
假设一个数据地址为0x0060FEE4,
他指向(多少)字节的内存空间,
存储的数据类型为什么?
------------------------
这就需要给地址分配一个类型,
C语言中
char * : 字符指针
指向1字节空间,数据类型为char;
int * :整型指针
指向4字节空间,数据类型为int;
double *
指向8字节空间,数据类型为double;
...
【类型 *】 构成指针类型
【类型】指针所指数据类型;
----------------------------
那么0x0060FEE4的类型为char *,
则它 指向1字节空间,
数据类型为char;
3> 指针变量
int * pa;
char * pc;
double * pd;
用指针类型定义的变量,
称为指针变量;
指针变量存储空间 4Byte;
#include <stdio.h>
int main()
{
printf("char * > %d Byte\n", sizeof(char *));
printf("int * > %d Byte\n", sizeof(int *));
printf("double * > %d Byte\n", sizeof(double *));
return 0;
}
char * > 4 Byte
int * > 4 Byte
double * > 4 Byte
0x0060FEE8
0x 00 60 FE E0
32位地址,寻址空间为4GByte
-------------------------
?内存空间为 8G, 16G,32G...,
有些空间找不到? ^_^
4> 取指针 &
&: 取指针,运算符;(读指针)
2个功能:
1> 读出【变量】地址;
2> 读出【地址】类型;
----------------------------
&num :
1> 读出num地址 0x0060FEFC
2> 读出地址类型 int *;
----------------------------
注意:
char *pc = &num;
因为:
&num读出地址类型为 int *
赋值给 char *, 类型不匹配;
5> 间接运算符 *
#include <stdio.h>
int main()
{
int num = 1;
int *ptr = #
printf("num > %p\n", &num);
printf("ptr > %p\n", &ptr);
printf("num = %d\n", num);
printf("ptr = %X\n", ptr);
*ptr = 8;
printf("num > %p\n", &num);
printf("ptr > %p\n", &ptr);
printf("num = %d\n", num);
printf("ptr = %X\n", ptr);
return 0;
}
间接运算符 *
对指针变量间接运算,
实现间接读写变量空间;
----------------------------
num = 8;
*ptr = 8;
----------------------------
int d = 0;
d = num;
d = *ptr;
6> 指针变量运算
#include <stdio.h>
int main()
{
int num = 1;
int *ptr = #
printf("num > %p\n", &num);
printf("ptr > %p\n", &ptr);
printf("ptr = %X\n", ptr);
ptr = ptr + 1;
printf("ptr = %X\n", ptr);
return 0;
}
ptr + 1,实际是加4,
因为ptr的类型为 int *;