【C语言】回炉重造的C之指针+结构体


——已经是第二次学C语言了,第一次学就是在指针这块遇到了问题,现在回过头再来学习,还是有必要自己整理一些干货的


****不是详细版本 ------仅方便理解****

一、指针到底是个什么牛马?

1.说指针之前先来了解下——内存

在这里插入图片描述

由于我们的电脑有32位/64位两种,拿32位来举例子
32位——32根地址线(也就是电线,给他们通电,产生0/1)
于是乎就会产生

00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000100
00000000000000000000000000001000
。。。
11111111111111111111111111111111

这种32个一串的地址一共有2^32 个也就是2^32 个bit,而1个字节=8bit,所以就会有(2^32)/8个内存单元

2.内存用来干什么

当然是用来存东西,举个栗子
在这里插入图片描述
然后呢,假设这4个字节的内存空间编号为501 502 503 504
在这里插入图片描述

问题来了,那a到底是哪个格子呢?让代码运行起来用监视器查看一下
在这里插入图片描述

请添加图片描述

监视器一查看就会发现&a取到的其实是第一个字节的地址,同时还发现,取地址是从低地址往高地址取的(从第一位往后,因为只要找到了第一位,后面的就依次+1即可),也就是如图
在这里插入图片描述

3.指针

接着上边,将a的地址给它打印出来,这里注意一个问题,因为每次的内存都是重新分配的,所以每一次打印出来的地址是不一样的
在这里插入图片描述
指针的定义

&    取地址操作符``
a     整型变量
&a 对a取地址  即   &a表示a的地址
p=&a把一个地址放进p中,地址=指针,所以p是一个指针变量
定义一个指针变量的语法为:int *p=&a;	  

在这里插入图片描述
为什么要这样定义
在这里插入图片描述

举个栗子

char ch = 'w';//ch是个char类型变量
char* p = &ch;//所以要用char*

地址和变量的关系请看图
在这里插入图片描述
存放10的地址就是指针,地址就好比你家门牌号 即————地址=指针
在这里插入图片描述

二、指针怎么使用

* ——解引用操作符

要想使用指针,就要用到解引用操作符,也就是 “ * ”号

int a =10;//先把10赋值给a
int* p=&a;//把a的地址存于指针p
 *p=20;//通过使用解引用操作符,通过a的地址找到a,把20赋给a
 printf("%d\n",a);//打印出来的a就是20

三、指针的大小

打印出各种类型的指针的长度

#include <stdio.h>
int main()
{
    
    
	
	printf("%d\n", sizeof(char*));
	printf("%d\n", sizeof(short*));
	printf("%d\n", sizeof(int*));
	printf("%d\n", sizeof(long*));
	printf("%d\n", sizeof(float*));
	printf("%d\n", sizeof(double*));
	return 0;
}

运行结果为
在这里插入图片描述
为什么全都是4,那是因为在32位的机器上,一个内存单元的大小为1byte=8bit,而4个字节(byte)=32个bit,上栗子``

00000000000000000000000000000001//这是一个32位地址char* short* int* long* float* double* 定义的是一个指针变量
指针变量里存放的也就是一个地址,所以说只要是地址,就是4个字节(64位的电脑,则为8个字节)
地址大小只取决于平台

四、结构体

一个复杂对象,栗如:
学生:
名子+年龄+性别+身高
—————————————————————————————————————
当遇到这种对象时,基本类型已经无法表示,这时候就需要用到结构体

#include <stdio.h>
struct Student//声明一个学生类型
{
    
    
   char name[20]int age;
   char sex[5];
   char id[12];
}//注意这里还有个分号不要忘了

int main()
{
    
    
//创建结构体变量
struct Student s1={
    
    "张三"20"男","20200506"};
struct Student s1={
    
    "李四"20"女","20200506"};
return 0;
}

语法格式就是这个样子,依葫芦画瓢,用就完了
结构体变量如果要访问成员变量,就要用 “.”操作符

printf("名字:%s 年龄:%d 性别:%s 学号:%s", s1.name, s1.age, s1.sex, s1.id);//即可访问并打印各个成员变量

同样,可以用指针来访问变量成员

struct Student*p=&s1;
printf("名字:%s 年龄:%d 性别:%s 学号:%s", (*p).name, (*p).age, (*p).sex, (*p).id);
printf("名字:%s 年龄:%d 性别:%s 学号:%s", p->name, p->age, p->sex, p->id);

两种方法都是可以的,都一样
“.”————————结构体变量.成员名
“->”————————结构指针->成员名

总结

本篇只对指针和结构体做简单介绍,方便理解为主,欢迎指出错误
//创作不易,如果觉得可以,三连走起来~看到会回访//

猜你喜欢

转载自blog.csdn.net/DerrickWestbrook/article/details/117787490