初始指针与结构体

指针

内存

在介绍指针之前,先给各位介绍一下内存地址。先看程序:

int main()
{
	int a = 1;
	printf("%#0X\n", &a);
	return 0;
}

当我们创建一个变量a时,首先要先内存申请4个字节的内存空间来存放变量a的值。
在这里插入图片描述
运行上面程序时,我们就可以得到变量a的地址。当电脑为32位时,它就有32位的地址线,通过高低电平的控制,我们就可以产生2^32个地址编号,它们分别是:

00000000 00000000 00000000 00000000

11111111 11111111 11111111 11111111

这样的编号我们把他们称为地址,而每个地址管理着1byte的内存空间大小。
既然一个地址值管理1字节的内存空间,那么占4个字节的整型数据的地址是哪个地址呢?
我们通过对上面程序的调试,通过内存窗口可以得知,整型数据的地址是所占内存空间第一个字节空间的地址:
在这里插入图片描述

指针

指针变量的定义

当我们要把变量的地址存储起来时,我们就要用到指针变量。
指针变量的定义为:是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址
通常我们通过 (类型)* +变量名 来定义指针变量

int main()
{
	int a = 1;
	int* pa = &a;
	*pa = 2;
	printf("%d", a);
	return 0;
}

如上述程序中pa,就是指针变量,而它储存的地址则是指针。我们通过&(取地址操作符)取a的地址,把它存储在指针变量pa中。指针变量前的数据类型代表它存储的地址的数据类型,这里pa存储的就是整型数据的地址。这里的表示pa为指针变量。我们也可以通过*(解引用操作符)来通过pa访问a,程序中就是通过pa=2;来改变a的值,运行的程序结果如下。
在这里插入图片描述

指针变量的大小

那指针变量的大小为多少呢?通过上文我们了解到指针变量是用来存储变量的地址标号的,而32位的机器的地址编号的大小为4byte,因此我们可以知道,在32位的环境下,指针变量所占空间大小为4个字节。
我们也可以通过下面程序验证:

int main()
{
	int a = 10;
	char b = 'a';
	char* p = &b;
	int* pa = &a;
	printf("%d\n", sizeof(pa));
	printf("%d\n", sizeof(p));
	printf("%d\n", sizeof(int*));
	printf("%d\n", sizeof(char*));
	printf("%d\n", sizeof(long*));
	printf("%d\n", sizeof(short*));
	printf("%d\n", sizeof(float*));
	printf("%d\n", sizeof(double*));
	return 0;
}

在这里插入图片描述
同理我们也可以知道64位的环境下的指针变量所占空间大小。
在这里插入图片描述

结构体

C语言有很多的数据类型,但是他们都只能描述简单的对象,而结构体就是为了用来描述复杂对象的。
比如说:你要记录一本书的信息,你可以定义如下结构体变量,用来记录书的名字、价格、作者等等 。

struct Book
{
	char name[20];
	int price;
	char author[20];
};

我们创建的struct Book就是结构体。
在定义一个结构体变量,并对它初始化,我们就可以通过.(结构体成员操作符)来访问结构体成员。当我们只知道结构体变量地址时 我们也可以通过 (结构体指针)+ ->+(成员名)的方式来访问结构体成员。

struct Book
{
	char name[100];
	int price;
	char author[100];
};

int main()
{

	struct Book b1 = { "c语言程序设计",199,"谭浩强" };

	struct Book* pb = &b1;

	printf("%s %d %s\n", pb->name, pb->price, pb->author);//->  结构体指针->成员名
	printf("%s %d %s\n", b1.name, b1.price, b1.author);//.-结构体变量.

	return 0;
}

运行结果如下:
在这里插入图片描述

创作不易,求个一键三连,一定会回访的(欢迎大家指正错误)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

八只脚抠脚

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

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

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

打赏作者

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

抵扣说明:

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

余额充值