C语言基础篇(三) 指针
导航:
1.指针
2. 数组
3. 结构体,共用体
4. 内存分布图
5. 段错误分析
----->x<------------->x<--------------->x<--------------->x<------------->x<-----
一切皆内存 .
1. 指针
1.1 认识指针和指针变量
假设,有一个大柜子,这个大的柜子,有很多很多的小格子,每一个格子,都有一个唯一的编码,从0开始,一直往下数.
指针: 就是,就是这个唯一编码,我们能通过这个唯一编码,找到指定的这个小格子.你就能存放或者取出东西.
指针变量: 变量实际上是在内存中圈一个空间, 指针变量就是定义一个盒子, 这个盒子是int大小, 里面存放的数据, 是一个地址. 这就是指针变量.
类比一下: int a; 这是在内存中声明一个小盒子,这个小盒子是int大小,可以用来存放数据.
char *p; 这也是在内存中声明一个小盒子,这个 小盒子1 呢,还是 int 大小,因为 指针变量 是int型的,
然后这个 小盒子1 里面存放的数据 不是普通的数据, 是一串地址, 通过这个地址, 我就能找到写着这个地址的另一个小盒子2,
这个 小盒子2 呢,是 char 大小的小盒子,里面可以放你想放的数据.
所以这个 p 就是指针变量, 他是int大小,指向另一个地址的变量 .
问? 为什么指针是int类型的??
假设 描述指针大小的盒子是char大小的,那就是 8位,256种状态.256种状态只能描述256个小格子.
假设我们现在就内存条就1G了,那我要用一个数,来描述1G里面所有的小格子,这个数要多大呢?
2^10 =1k, 2^20 =1M, 2^30 =1G, 所以,要描述1G种状态位,我至少要有30位的大小来描述一个数据.
在32位的操作系统中,cpu的一次访问,就能表达4G种状态内的任意一种.也就是说,在32位的操作系统中,我能识别出4G上限的编码,4G+1我就识别不出来了,因为已经超出了我的int类型的大小.
所以,一般 用 int 来描述 一个指针的大小 .
你想啊,我有300个小格子,但是你的char 只能数到 256 ,剩下的小格子不是浪费了吗 .
char *p 说明了2个信息
(1) 指针p 这个 小盒子1 的大小是 int
(2) 指针P 所指向 小盒子2 的大小是 char,
int main() { int *p1; char *p2; printf("p1 is %u,p2 is %u\n",sizeof(p1),sizeof(p2)); //结果都是 4,因为指针变量的大小是int型的 . return 0; }
int main() { int a = 0x12345678; int *p1; //指针声明 p1 = &a; //指针赋值 printf("the p1 is %x\n",*p1); return 0; }
1.2 指针变量的声明和使用 .
声明: int *p;
使用:
存和取: *p
赋值: p = &a;
int main(){ int a = 100; //定义一个变量a,是100; int *p; //定义一个指针p p = &a; //将p指向a的地址 *p++; //通过打开通道的方式,对p指向内存空间里面的内容 进行+1; printf("a is %d\n",a); //101 return 0; }
1.3 指针和修饰符
跟变量一样,除了空间大小的描述,还有空口位置的描述.指针同样有这种描述.
-- const
const 认为是只读性质的变量,给人一种, 不能变的感觉 .
(1) const char *p; // p是可变的,随便可以指向哪里,但是p指向的内容是固定不变的.
(2) char* const p; // p是固定不变的,但是p指向的内容是可以随意改变的.
(3) const char* const p; //p是固定不变得,而且它指向的内容也是不变的.
(1)--> 字符串. "xxxxx" 双引号里面的内容是无法修改的 .
(2)--> 硬件资源 ,地址不能变,但是里面的内容是不断刷新的.
(3)--> ROM
int main(){
const char *p = "helloworld\n"; //这句话的意思是,指针p指向了一个字符串的地址, printf("the fiest is %c",*p); //结果是 'h',因为是char类型的. *p = 'k'; //段错误,因为const空间是不能做修改的 . return 0; }
-- volatile
防优化 .
volatile char *p;
while(*p ==100);
-- typedef
typedef char *name_t; name_t 是一种指针类型的名称,指向char内存...
name_t abc;
2. 数组
-- 一维数组 和 二维数组 和多维数组
3. 结构体,共用体
4. 内存分布图
5. 段错误分析