【最受欢迎最容易理解的初阶c语言教学】5.指针和结构体

      大家好?,我是想要慢慢变得优秀的向阳?同学?‍?,今天又来【最受欢迎最容易理解的初阶c语言教学】内容?,生产队的驴都不敢这么勤奋?,今天彻底结束【最受欢迎最容易理解的初阶c语言教学】内容?,让我们一起学习c语言一起在寒假!!!???

??成功的含义不在于得到什么,而是在于你从那个奋斗的起点走了多远。??

目录

??指针??

??内存的解释??

??指针变量的定义??

??指针变量的使用??

??指针变量的大小??

??结构体??

??结构的定义??

??结构体的初始化和使用??

??两个操作符??


??指针??

??内存的解释??

在说另新人感到发指的指针之前,我们先聊一聊内存这个概念。

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

      而内存单元的编号通过地址线通电或者断电产生的数字信号0/1的组合来表达内存单元的编号,如生活中32位,64位机器,就是指的是多少跟地址线,一根地址线表达一个0或者1,32位就是32跟地址就是32个0或者1组成的地址长度,这里地址编号由0x(区别十进制和十六进制用的像前缀一样的东西!)+8个十六进制(等效为32个二进制)

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

#include <stdio.h>
int main()
{
 int num = 10;
 &num;//取出num的地址
    //注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
 printf("%pn", &num);//打印地址,%p是以地址的形式打印
 return 0;
}

??指针变量的定义??

那地址如何存储,需要定义指针变量(储存地址的变量)

#include<stdio.h>
int main()
{
	int a = 10;
	int* pa = &a;//pa是指针变量,储存了变量a的地址
	printf("%p", pa);

	return 0;
}

       解释:因为储存的变量是int类型所以指针变量类型是int*(这里的*是格式需要,代表这个类型是指针变量类型,和以后讲的*解引用操作符要区别开来!)

??指针变量的使用??

      上面我们已经解释的指针到底是什么,不要把它想得过于困难,过于高大上,简单认为其实就是一段数字而已。

#include <stdio.h>
int main()
{
    int num = 10;
    int* p = &num;
    *p = 20;//这里使用指针变量的*和上面定义指针变量的*完全不一样!
    return 0;
}

       把地址存储到指针变量并不是我们最终的目的,就像你的家庭地址,并不是为了单纯的记住,而是有一天可以去你家找你请你吃饭什么的,所以这里的p为存放num地址的指针变量,*pc这个*是解引用操作符,要清晰的区分两个*的作用!定义时的*是格式需要,代表这个类型是指针变量类型;使用时的*是解引用操作符,通过p存储的地址在内存中找到地址对应的变量,来进行其他操作的!

储存是为了更好的找到

??指针变量的大小??

#include <stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
    printf("%dn", sizeof(char *));
    printf("%dn", sizeof(short *));
    printf("%dn", sizeof(int *));
    printf("%dn", sizeof(double *));
    return 0;
}

       指针变量的大小,不取决于指针变量指向的变量类型而取决于多少位的平台!因为在多少位平台就有多少位二进制来表达你的数据地址!我们算的大小不是数据的大小,而是数据地址的大小,数据地址大小又取决于多少位平台下多少个bit位的表达,sizeof用字节表示大小,所以地址大小用字节表示只有4或8的区别!

??结构体??

??结构的定义??

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

比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。

struct Stu
{
    char name[20];//名字
    int age;      //年龄
    char sex[5];  //性别
    char id[15]; //学号
};

??结构体的初始化和使用??

int main()
{
struct Stu s = {"张三", 20, "男", "20180101"};
//.为结构成员访问操作符
printf("name = %s age = %d sex = %s id = %sn", s.name, s.age, s.sex, s.id);
//->操作符
struct Stu *ps = &s;
printf("name = %s age = %d sex = %s id = %sn", ps->name, ps->age, ps->sex, ps-
>id);
return 0;
}

       定义,只是定义了一个结构体的一个新的类型而已就像画了一张图纸,并没有开辟真正内存空间,而在mian函数中是真正的开辟内存空间变量名为s1,s2就像建成一个房子一样,图纸只是告诉你具体的结构和样子,但没有去填好,房子就是真正存在且填满了!

??两个操作符??

.和->

 两个都为结构成员操作符,区别在于:. 是操作对象是结构体,->的操作对象是指针

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>