栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

#C语言-基础篇(Ⅲ)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

#C语言-基础篇(Ⅲ)

目录

八、指针(基础)

8.1 如何产生地址?

8.2 地址的使用

8.2.1 取地址

8.2.2 指针变量

8.2.3 使用(基础)

8.3 指针的大小


八、指针(基础)

       引:通常买电脑时,配置中有32位/64位,以及内存4G/8G/32G...而如此大的内存又是如何使用的呢?正如在一个大区域找到某个小地方,我们需要知道的是那个地方的地址编号,再通过地址编号找到该地方。同理,编程中的数据需要一块小空间来存储,这块空间的编号就也称为地址,也指针就是地址。

如图8_1 :

8.1 如何产生地址?

       我们这里用32位处理器来解说。32位处理器中就有32条地址线(物理的线),当接通电源后,每条线都会有电信号,产生1、0信号(正电为1,负电为0),这样32条线就能够产生2的32次方个二进制数,这些二进制数编号就是每一个内存单元的地址(补:规定,内存单元的单位为字节)。通常的,我们见到的地址编号都是由八个十六进制数组成,毕竟32个二进制数太多了。

        同理,64位处理器自行理解。

如图8_2,32位所产生的二进制序列:

8.2 地址的使用

8.2.1 取地址

       在学习变量时,我们知道,当创建变量时,实际上就是申请一块内存空间来存储变量信息,那么,怎样才能知道我们创建的变量其中数据存储的地址呢?下面我们来介绍取地址操作。

代码8_1取出变量的储存地址:

#include

int main() {
	int b = 9;//创建变量b,并初始化为9

	printf("%p", &b);
	return 0;
}

说明:

(1)代码8_1即实现了取出并打印变量b存储数据的地址;

(2)%p,地址的打印类型,使用与%d相似,同时与取地址操作符&一同使用;

(3)打印所得地址表示为八个十六进制数,图8_3:

 

 (4)变量b为整型数据类型,所以为四个字节大小,而打印地址时,我们打印的是第一个单位空间(字节)的地址,即通过第一个地址可找到其他三个单位空间的地址,图8_4:

 补:变量的存储地址也可以在编译程序的内存管理中查看。

8.2.2 指针变量

定义:用来存放地址的变量。

代码8_2,指针变量:

#include

int main() {
	int b = 9;//创建变量b,并初始化为9
	printf("%p", &b);

    int * pb = &b;
    scanf("%p",pb);

	return 0;
}

说明:

(1)创建指针变量a,来存储变量b的地址,图8_5:

(2)指针变量的数据类型为 int *,其中int表示pb指向对象b中元素的数据类型,*号表示a为指针变量;

(3)同理,如果有char ch='A',那么指向ch地址的指针变量的数据类型为char*  ;

 8.2.3 使用(基础)

       我们知道指针变量是指向某一变量的地址的,那么,我们就可以通过指针变量,找到该变量的地址,从而操作该地址所存储的变量。这时,需要使用要解引用操作符*了,如下,

代码8_3:

#include

int main() {
	int b = 9;//创建变量b,并初始化为9
	printf("%pn", &b);//打印地址
	int* pb = &b;//创建指针变量pb,并指向b的地址
	printf("%pn", pb);//打印地址

	*pb = 81;//通过pb中的地址找到b的地址,并将该地址数据改为81
	printf("%d", *pb);

	return 0;
}

图8_6,运行结果:

 说明:

解引用操作符*,对pb进行解引用操作找到所指向对象b的地址,同时可操作该地址;

图解:

int b=9=>假设b的储存地址为0000000A
int* pb=&b=>pb=0000000A
*pb=81=>通过对pb解引用找到b的地址,并使b=81

8.3 指针的大小

       对指针有了初步了解后,现在我们来看指针的大小。与计算数据类型的大小相同,计算指针大小同样可以使用关键字sizeof,代码8_4:

#include

int main() {
	printf("%dn", sizeof(char*));
	printf("%dn", sizeof(short*));
	printf("%dn", sizeof(int*));
	printf("%dn", sizeof(long*));
	printf("%dn", sizeof(long long*));
	printf("%dn", sizeof(float*));
	printf("%dn", sizeof(double*));
	return 0;
}

得到运行结果,图8_6:

 可以看到,指针的大小都是相同的。

说明:

我们知道,指针存储的地址,所以指针的大小取决于地址的大小;而前面提过,地址的产生即32条地址线通电后所产生的由1、0组成的有序二进制数,那么,在32位处理器上,地址有32个数,当每个数用一个bit位来存储时,就有32个bit位(4个字节)来存储,所以地址的大小为4个字节,可知地址的大小与其所存储的数据类型无关。

同理可知,在64位处理器中,地址的大小就是64个bit位,也就是8个字节。 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/347977.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号