4_29 C语言_指针、结构体

本文详细解释了指针在内存管理中的作用,包括内存单元的地址、取地址操作符、指针的定义和使用、解引用操作以及结构体的运用。同时提到了编程中的易错点,如switch语句中的关键字和预处理器指令。
摘要由CSDN通过智能技术生成

1、指针


1.1内存

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是一个字节。
为了能有效的使用内存,就把内存单元进行了编号,这些编号就被称为该内存单元的地址。

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

创建变量就是要在内存里面申请空间

打开这个监视要先进行调试,按ctrl+F10,之后,按照下面这样操作,就可以调出监视界面

 看内存:(跟上面打开监视界面一样,但是内存界面是在监视的下面,有个“内存”)

 打印地址:

#include<stdio.h>
int main()
{
	int a = 10; //向内存申请4个字节,存储10
	&a;//(这&就叫做取地址操作符),这样就可以取出a的地址
	printf("%p\n",&a);// % p:以地址的形式打印数据,打印的就是地址

	return 0;
}

结果:

注:每一次运行程序a变量都会重新创建,所以这个地址是变化的,跟上一次的不一样

1.2指针

把这个地址存起来:

#include<stdio.h>
int main()
{
	int a = 10; //向内存申请4个字节,存储10
	&a;//(这&就叫做取地址操作符),这样就可以取出a的地址
	printf("%p\n",&a);// % p:以地址的形式打印数据,打印的就是地址
	//00000012CFB3F964
	int* p = &a;//把a的地址存起来,放到p变量里面去,p变量的类型叫int*
	//这个时候,我们把p叫指针变量
	return 0;
}

内存单元有编号,这个编号其实就是地址,而地址也被称为指针,所以指针就是地址,就是那个内存单元的编号而已。
所以存放指针(地址)的变量就是指针变量。

指针就是用来存放地址的,存放的是别人的地址。 

*p;-->解引用操作符,意思就是通过p中存放的地址,找到p所指的对象,*p就是p指向的对象,

此时*p就相当于a 

#include<stdio.h>
int main()
{
	int a = 10; //向内存申请4个字节,存储10
	&a;//(这&就叫做取地址操作符),这样就可以取出a的地址
	//printf("%p\n",&a);// % p:以地址的形式打印数据,打印的就是地址
	//00000012CFB3F964
	int* p = &a;//把a的地址存起来,放到p变量里面去,p变量的类型叫int*
	//这个时候,我们把p叫指针变量
	*p=20;//解引用操作符,意思就是通过p中存放的地址,找到p所指的对象,*p就是p指向的对象
	//此时*p就是a,就相当于把20赋值给a(*p找到的就是a,就是a本身)
	printf("%d\n", a);  //20
	return 0;
}

结果:

此时a的值就被改变了

&a和*p这两个操作是一对儿的,这俩一来一回,可以互相抵消

&a:取地址a取出a的地址;

*p:找到a去

结论:指针就是地址,指针变量就是用来存放地址的。

1.3指针变量的大小

不管是什么类型的指针,都是在创建指针变量
指针变量是用来存放地址的
一个指针变量取决于一个地址存放的时候需要多大空间
32位机器上的地址是:32bit位的 --4byte,所以指针变量的大小是4个字节
32位机器上的地址是:64bit位的 --8byte,所以指针变量的大小是8个字节

#include<stdio.h>
int main()
{
	//int* p;
	//char* p2;

	printf("%zd\n", sizeof(char*));
	printf("%zd\n", sizeof(short*));
	printf("%zd\n", sizeof(int*));
	printf("%zd\n", sizeof(float*));
	printf("%zd\n", sizeof(double*));

	return 0;
}

结果:

 注:用%d也可以打印出来,但是会有警告,

int* p1,p2,p3;  --->只有第一个是指针变量

int *p1,*p2,*p3;  -->此时才是连续定义了3个指针变量 

2、结构体 

结构体是C语言中特别重要的知识点,结构体使得C语言又能力描述复杂类型。

比如描述学生,学生包含:名字+年龄+性别+学号这几样信息,是复杂对象

这里就只能使用结构体来描述了。

C语言就给了自定义类型的能力,自定义类型中有一种叫:结构体,而这个结构体的关键字

就是:struct

结构体是把一些单一类型组合在一起的做法

#include<stdio.h>
//学生
struct Stu
{
	//结构体的成员
	char name[20];//姓名
	int age;//年龄
	char sex[10];//性别
	char tele[12];//电话
};
int main()
{
	struct Stu s = { "zhangsan",20,"nan","12345678923" };//创建对象s并对s进行初始化
	//拿起这个类型(struct Stu)创建了这个变量(s)
	printf("%s %d %s %s\n", s.name, s.age, s.sex, s.tele);
	//要打印这个s对应的成员,用 s.成员名 ,就可以找到对应成员
	//成员名就是name这些
	return 0;
}

结果:

结构体对象访问他里面的成员用的是 .  

结构体对象.成员名

#include<stdio.h>
//学生
struct Stu
{
	//结构体的成员
	char name[20];//姓名
	int age;//年龄
	char sex[10];//性别
	char tele[12];//电话
};
void print(struct Stu* ps)//地址要放到指针变量里面去,这个ps指针变量就可以存s的地址
{
	printf("%s %d %s %s\n", (*ps).name, (*ps).age, (*ps).sex, (*ps).tele);
	//这个*ps就是找到外面的s,然后s我要找到他的成员就是(*ps).name。(这里的(*ps)可以直接用s代替,就相当于
	// (*ps).name等价于s.name),但是这个写法很啰嗦
	printf("%s %d %s %s\n", ps->name, ps->age, ps->sex, ps->tele);
	//这个ps指向的是s,那我要找到ps所指向的对象s的成员,可以直接用 ->
	//这个ps->name的意思就是:ps指向那个对象s的成员name
}
int main()
{
	struct Stu s = { "zhangsan",20,"nan","12345678923" };
	print(&s);//把s的地址取出来传给print函数,把地址进行了传参
	return 0;
}

结果:

操作符:->

结构体指针变量 ->成员名   (这个用法的前提条件是,你得到了地址)

总结:

操作符:.

结构体对象.成员名      (这个用法的前提条件是,你得到了一个结构体对象)

操作符:->

结构体指针变量 ->成员名      (这个用法的前提条件是,你得到了地址)

3、作业补充(易错):

1、用在switch语言中的关键字不包含哪个?

A、continue        B、break        C、default        D、case

2、下面哪个不是关键字:

A、int        B、struct        C、define        D、continue

答案

1、答:A  continue是用在循环语句里面的

2、答:C  define 不是关键字,是预处理指令!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值