最后初步认识指针和结构体

今天讲完最后的初识c语言,我们下一篇就开始进入深层次的写每一个环节啦!

加油,兄弟我和你一起努力,走过这c语言之路,经历过阵痛,最后那即便是美好了!!!


指针

指针听着这名字好像很可怕的样子,虽然你没学过但可能听说过

指针是我们说的指南针么

这个么?

 哈哈当然不是,指针是c语言非常抽象的东西


 好接下来开始我们的正题

给一下指针的官方定义:.在C语言中,指针是指一个变量的地址,通过变量的地址″指向″的位置找到变量的值,这种″指向″变量地址可形象地看作″指针″。用来存放指针的变量称为指针变量,它是一种特殊的变量,它存放的是地址值。

什么???竟然是地址。

如果要说指针那就得从内存说起

内存官方定义:,它用于暂时存放CPU中的运算数据,与硬盘外部存储器交换的数据。它是外存CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行,内存性能的强弱影响计算机整体发挥的水平。只要计算机开始运行,操作系统就会把需要运算的数据从内存调到CPU中进行运算,当运算完成,CPU将结果传送出来。

说了一大堆其实就是给我们的数据,程序存储的,当然存储很重要在计算机起重要作用

我们生活中都有房子的建造空间,那内存呢当然有,我们先把内存看成是这样的

 在内存中我们把内存分解成多个空间,这些小的空间也叫每个存储单元,既然我们生活中每家每户都有名字,都有房子的地止,那内存当然也有,这是我们就把内存每个存储单元都给他编号,以后想找到它,那就很容易了,这个编号就是我们找到它的重要途径。

这是我们就可以根据上面的定义理解了指针其实就是地址,如果我们想快速找到某一个变量,那我们必须得用指针了。简单地说指针就是指向变量和对象的地址。

那指针的作用是啥?

特别是对象的数据量实在太大,程序员就会用指针来做形参,只需要传递一个地址就行,大大提高了效率。

 我举个例子比如我们手机流量有100兆,我们采用10兆10兆用,当我点击qq的时候我用了10兆,然后不用了,接着点击微信继续使用,这是操作系统就会问你我持续给你流量为啥不在同一个程序呢,这时我们就有另外的方式当我第二次点击qq时用了10兆,那如何在同一程序中连续使用呢?这是我们就需要把第二个10兆和第一个10兆匹配到一起,那咋匹配到一起,那就需要指针了,指针需要找到第二个10兆,然后在和第一个10兆匹配到一起,这时就可以在同一程序中连续使用了。

尤其在进行传值调用时,比如函数传参,如果需要传很多的变量很多的内容,这样传送的就很慢,我们如果把一个地址传送过去,所有内容就传过去了,是不很方便

 我们来形象的理解下指针的概念举个例子比如你家已经锁门了,你有两种方式进屋子里第一是你自己有钥匙,第二是你没有钥匙你就要给家里人打电话要钥匙进屋子里,在c语言中我们称第一种为直接访问第二种就是间接访问,而在c语言中的间接访问就类似指针的概念,指针就是通过地址找到你要的变量和内容。
看代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 10;
	int * p= &a;
	*p = 20;
	
	return 0;
}


我们创建一个整型变量a占内存空间为4个字节也就是把数字10赋值给a
上面讲到指针也就是我们说的地址,那我们将a的地址取出来我们就要用&符号,既然上面10是用变量a存储,那&a怎么存储那就是int*,( 其中*在c语言中叫做间接访问操作符又叫做解引用操作符),这里的int是指取出a的地址的变量为一个整型变量,而*是指通过a的地址指向a的变量值,而p就是一个指针变量(所谓指针变量就是是存放指针的变量),那就像在我们生活中,你找到你同学家的地址就完事了么?你是不得去找到它,这里也是我们找到一个变量存放a的地址那我们得用它,这里我们用*p=20,这里的*p是啥?就是我们刚才讲的通过p存放a的地址来找到变量值a,那这里的*p其实就等于刚才定义变量a的值,我们把a改成20那打印结果就为20,如果你不相信那我们就可以把a和*p的地址打印一下看结果如何
看代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 10;
	int * p= &a;
	*p = 20;
	printf("%d\n", a);
	return 0;
}


显然打印的地址一模一样,这里我们就把这个指针的概念讲清楚了

我们这里画图理解一下存放地址的过程

 这里int类型里放的是a=10,地址为0x215ff52

我们就用int*来存放a的地址p


指针的大小
我们前几篇文章讲到有许多数据类型我们这里复习一下(假设我们说在32平台上)size of char: 1
  size of int: 4
  size of long:4
  size of float:4
  size of long long:8
  size of double:8
那我们指针是不也应该有指针的大小
我们也来计算一下
看代码

#include<stdio.h>
int main()
{/*
	int a = 0;
	int* p = &a;*/
	printf("%d\n", sizeof(int*));
	printf("%d\n", sizeof(char*));
	printf("%d\n", sizeof(long *));
	printf("%d\n", sizeof(long long*));
	printf("%d\n", sizeof(float*));
	printf("%d\n", sizeof(double*));



	return 0;
}

这里为什么都为4啊,char不应该是1么
这里我就给大家讲讲本质了
我们在编译器都会显示有64平台和32平台那这里32(拿32举例)是啥意思?其实这里的32是指32跟地址线,
那他们都靠什么给计算机传送数据呢那当然是二进制(应该都会知道二进制只有0和1),这里的二进制其实也是物理形成电流的高平和低平(0/1),那我们是说32位平台那一个地址就是32个bit位那一共能组成多少个呢给大家看个图
这里也就有2的32次方
那一个地址就是32bit位也就是4个字节,这里我们就很好的解释为什么指针的大小都为4了(也更好的体现指针就是我们存放的地址)。
地址是如何存放的呢?
我们现在都知道了一个指针也就是地址的大小位4个字节,也就是有四个地址,那在这里我们存放变量的时候统一存放在4个地址中的第一个地址(这里的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址))

结构体


官方概念:结构体是由一批数据组合而成的一种新的数据类型,组成结构型数据的每个数据称为结构型数据的“成员”。结构体通常用来表示类型不同但是又相关的若干数据。
通俗的说,当我们定义一个数的时候我们都有int,float。那当我们定义一个复杂的对象用那些数据类型就很难定义清楚,比如一个人,一本书这样的复杂对象就有很多的属性,比如,人有性别,姓名,学号,家庭住址,比如书有书名,价格,书名编号,书的类型
像我们定义这些一个数据类型根本说不清楚的情况下我们就引出结构体的概念他就可以定义一个复杂的对象,上面我说的这些复杂的对象的属性在这里就叫做结构体成员那我们如何来创建结构体成员呢
看代码(用书举例子)

//创建一本书的结构体成员
struct book
{
	char name[20];//书名
	int prize;//书的价格
	int num;//书的编号
};


我们现在创建了结构体成员,那我们给他初始化一下,看代码

//结构体变量的初始化
	struct book b = { "c语言",20,"2021036525" };


这里我们已经初始化了结构体成员那我们接下来是不得知道他是谁,属性都有什么,我们这里就要进行结构体成员的访问(也就是打印结构体具有的属性)

结构体成员访问
这里我们就给大家讲一个新的操作符就是.点(操作符)我们怎样访问呢
那就是结构体变量.结构体成员,这是就可以访问了能够很好的打印出来

//打印结构体变量(结构体变量访问)
printf("%s %d %s\n", b.name, b.prize, b.num);

还有一种访问方式
上面我们讲到了指针有直接访问和间接访问,刚才的用点(.)访问就是直接访问,那我们现在用指针来进行间接访问一下首先呢按照上面的我们当然是取出结构体变量的地址然后进行解引用一下就很好的找到结构体变量了
看代码

struct book* pb = &b;//取出结构体变量的地址
	
	printf("%s %d %s\n",(*pb).name, (*pb).prize, (*pb).num);

这里的*p就相当于上面的结构体变量了

再来复习一下我们这里的*p是啥来着?
*p就是通过p存放结构体变量的地址进而指向结构体变量
这里的指向我们又可以用一个操作符来代替那就是->操作符
看代码


struct book* pb = &b;//取出结构体变量的地址
printf("%s %d %s\n", pb->name, pb->prize, pb->num);


看打印结果


是不跟上面的一样了



//创建一本书的结构体成员
struct book
{
	char name[20];//书名
	int prize;//书的价格
	char num[20];//书的编号
}b;
#include<stdio.h>
int main()
{
	
	//结构体变量的初始化
	struct book b = { "c语言",20,"2021036525" };
	struct book* pb = &b;//取出结构体变量的地址
	/*printf("%s %d %s\n", b.name, b.prize, b.num);
	printf("%s %d %s\n",(*pb).name, (*pb).prize, (*pb).num);*/
	printf("%s %d %s\n", pb->name, pb->prize, pb->num);

	
	return 0;
}


好我们来进行总结一下结构体变量访问的几种方式
    1.结构体变量.结构体成员
    2.结构体指针.结构体成员
    3.结构体变量->结构体成员

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值