17.指针的概念及其分类

内存

存储器

存储数据的器件

外部存储器

长期存放数据,掉电不丢失数据。
常见的外存数据:硬盘、ROM、U盘

内部存储器

暂时存储数据,掉电丢失
常见的内存数据:ram、DDR
物理内存
实实在在的存储设备。
虚拟内存
操作系统虚拟出来的内存。
32bit 32根寻址总线
0x00 00 00 00
0xff ff ff ff
在这里插入图片描述
操作系统会在物理内存和虚拟内存之间做映射。
在这里插入图片描述
在32位系统下,每个进程(运行中的程序)的寻址范围是4G
0x00 00 00 00 ~ 0xff ff ff ff
在运行程序的时候,操作系统会将虚拟内存进行分区如下:

1.堆
在动态申请内存的时候,在堆里开辟内存。

2.栈
主要存放局部变量(在函数内部,或复合语句内部定义的变量)。

3.静态全局区
1):未初始化的静态全局区
静态变量(定义的时候加static修饰),或全局变量,没有初始化的,存在此区。
2):初始化的静态全局区
全局变量、静态变量、赋过初值的存放在此区。

4.代码区
存放程序代码

5.文字常量区
存放常量

内存是以字节为单位来存储数据的,可以将程序中的虚拟寻址空间,看成一个很大的一维字符数组。

指针的概念

系统给虚拟内存的每个存储单元分配了一个编号,0x00 00 00 00 ~ 0xff ff ff ff,称之为地址。指针就是地址。

指针变量:用来存放地址编号的变量。

在32位平台下,地址总线是32位的,所以地址是32位编号,指针变量是32位即4个字节。

注意:
1.无论什么类型的地址,都是存储单元的编号,在32位平台下都是4个字节,即任何类型的指针变量都是4个字节大小。
2.对应类型的指针变量,只能存放对应类型的变量的地址。
在这里插入图片描述

指针变量的定义

1.简单的指针变量

数据类型 * 指针变量名
int * p; //定义了一个指针变量p

在定义指针变量的时候,*是用来修饰变量的,说明变量p是个指针变量。
变量名是p。

2.关于指针的运算符

& 取地址 、 * 取值

例:

int a = 0x1234abcd;
int *p;
p = &a; //把a的地址给p赋值,&是取地址符。

p保存了a的地址,也可以说p指向了a。
p和a的关系分析:a的值是0x1234abcd,假如a的地址是:0xbfe89869
在这里插入图片描述

int num;
num = *p;

分析:
1.在调用的时候 *代表取值的意思,*p就相当于p指向的变量,即a
2.故 num = *p 和 num = a 效果是一样的。
3. num的值为 0x1234abcd。

如果在一行中定义了多个指针变量,每个指针变量前面都需要加 * 来修饰

int *p,*q; //定义了两个整型的指针变量p和q
int *p,q; //定义了一个整型指针变量p,一个整型变量q

#include<stdio.h>
int main()
{
	int a = 100, b = 200;
	int* p_1, * p_2 = &b;
	p_1 = &a;
	printf("a=%d\n", a);
	printf("*p_1=%d\n", *p_1);
	printf("b=%d\n", b);
	printf("*p_2=%d\n", *p_2);
	return 0;
}

在这里插入图片描述

3.指针大小
#include<stdio.h>
int main()
{
	char* p1;
	short int* p2;
	int* p3;
	long int* p4;
	float* p5;
	double* p6;
	printf("sizeof(p1)=%d\n", sizeof(p1));
	printf("sizeof(p2)=%d\n", sizeof(p2));
	printf("sizeof(p3)=%d\n", sizeof(p3));
	printf("sizeof(p4)=%d\n", sizeof(p4));
	printf("sizeof(p5)=%d\n", sizeof(p5));
	printf("sizeof(p6)=%d\n", sizeof(p6));
	return 0;
}

在这里插入图片描述

#include<stdio.h>
int main()
{
	int a = 0x1234abcd;
	int* p;
	p = &a;
	printf("&a=%p\n", &a);
	printf("p=%p\n", p);
	return 0;
}

在这里插入图片描述

指针的分类

按指针指向的数据类型来分

1.字符指针

字符型数据的指针

char* p; //定义了一个字符指针变量,只能存放字符型数据的地址编号
char ch;
p = &ch;

2.短整型指针

short int* p;
short int a;
p = &a;

3.整型指针

int* p;
int a;
p = &a;

注:多字节变量,占多个存储单元,每个存储单元都有地址编号,
c语言规定,存储单元最小的那个编号,是多字节变量的地址编号。

4.长整型指针

long int* p;
long int a;
p = &a;

5.float型指针

float* p;
float a;
p = &a;

6.double型指针

double* p;
double a;
p = &a;

7.函数指针
8.结构体指针
9.指针的指针
10.数组指针
11.通用指针 void*

总结:无论什么类型的指针变量,在32位系统下都是4个字节,在64位系统下是8个字节。指针只能存放对应类型的变量的地址编号。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oo0day

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值