C语言指针和结构体简单介绍

指针

内存

电脑为了更有效的使用内存,将内存分成了一个个的内存单元,一个内存单元的大小是一个字节,但是怎么用这些内存呢,电脑为了访问内存的每个单元,就给每个单元编号,这些编号就是一个地址,地址就是指针。

就如图所示。

变量的指针

变量是创建在内存中的,在内存分配空间,每个内存单元有地址,所以变量也有地址。

取出变量的地址:

int main()
{
	// 地址 == 指针 == 内存单元编号
	//内存单元为 1 个字节
	int num = 10;// 每个字节都有地址,int num 就有四个地址
	int* p = #// 取出的是第一个地址也是较小的那个
	printf("%p", p);
}

因为int 类型是四个字节大小,所以就有四个地址,取出的是较小的那个,要打印地址用 %p。

变量在内存中如图(图中的地址只是列举)。

指针变量

我们先知道一个字节有一个地址,而不是一个地址的大小是一个字节。所以我们可以用指针变量来看看一个地址的大小是多少。

 //指针变量 
int main()
{
	int num = 10;
	printf("num = %d\n", num);
	int* p;
	p = #
	*p = 20;// *p == a
	//补充 在指针变量里什么都是地址
	printf("num = %d", num);
	return 0;
}

定义指针变量如上述代码一样,int* *号说明 p 是指针变量(* 号叫解引用操作符 ,&是取地址符)。将 num  的地址给 p ,*p 就相等于变量num。

可以用地址来改变变量 num 的值。所以除了int 类型,其他类型也可以。

指针变量的大小

 指针变量的大小取决于地址的大小,我们用sizeof函数来看指针变量的大小

//指针变量的大小
int main()
{
	printf("%zd\n", sizeof(char *));// 结果都为8,因为我的电脑是64位,所以所有指针变量大小都是8个字节
	printf("%zd\n", sizeof(int *));//  32位电脑就是4个字节
	printf("%d\n", sizeof(float *));// 地址哪来的,64位机器,64位物理地址线,64bit,2的64次方,这就是机器的内存
	printf("%zd\n", sizeof(double *));// 一个字节有一个地址,都是不代表地址就是一个字节的,地址是8/4个字节的存储
	printf("%zd\n", sizeof(short *));
	printf("%d\n", sizeof(long *));
	return 0;
}

结果为:

所有的指针变量的大小都是一样的,指针变量(地址)的大小就只取决于电脑。因为我的电脑是64位,所以所有指针变量大小都是8个字节,32位电脑就是4个字节。所以要存储地址就需要8个字节。再次提醒一个字节有一个地址,但是不代表地址就是一个字节的,地址是8/4个字节的存储。

这个图上的指针变量是四个字节。

结构体

有时候有些东西很复杂,我们怎么用类型来定义呢,这个时候我们就需要结构体来描述复杂类型。

我们来描述学生:

// 结构体类型
struct stu
{
	char name[20];
	int age;
	char sex[5];
};// ;号是必要的

int main()
{
	//结构体变量的初始化
	struct stu a = { "张三", 20,"男" };//     变量.成员
	printf("name = %s,age = %d, sex = %s\n", a.name, a.age, a.sex);
	
	struct stu *p = &a;//                     指针->成员
	printf("name = %s,age = %d, sex = %s\n", p->name, p->age, p->sex);
	
}

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值