C语言——指针初阶、结构体初阶

目录

 

🌲指针

🌼指针是什么

🌼野指针

🌱野指针的几种情况

🌱如何规避野指针?

🌼指针运算

🌼指针的不同表示

🌲结构体

🌼结构体的定义

🌼结构体的赋值

🌼结构体成员的访问 

🌱点操作符.  

🌱->操作符

 🌼写一个函数打印结构体的内容

🌱方法1:传值调用

🌱方法2:传址调用(节省空间,推荐)


🌲指针

🌼指针是什么

指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。

在 C/C++语言中,指针一般被认为是指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。

                                                                                ————来自"百度百科"

简单来说,指针是一种保存变量地址的变量。

🌼野指针

🌱野指针的几种情况

 

  1. 局部变量不初始化默认是随机值
  2. 指针越界也会造成野指针
  3. 指针指向的空间释放

🌱如何规避野指针?

1.初始化为空指针(当前不知道应该初始化为什么地址的时候)

int* p=NULL;

初始化指针(明确知道初始化的值)

int a=1;int *p=&a;

2.小心数组越界

3.指针指向空间释放及时置空

4.指针使用前要检查有效性

🌼指针运算

  • 指针+-

可以对指针变量 p 进行 p++、p--、p + i 等操作,所得结果也是一个指针,只是指针所指向的内存地址相比于 p 所指的内存地址前进或者后退了 i 个操作数。

  • 指针-指针(得到指针之间元素的个数)
  • 指针的关系运算(地址比较大小)

🌼指针的不同表示

注意:[ ]是一个操作符 2和arr是两个操作数

int arr[10]={1,2,3,4,5,6,7,8,9,10}int* p=arr;printf("%p
",2[arr]);printf("%p
",arr[2]);

arr[2] --> *(arr+2) -->*(2+arr) --> 2[arr]

arr[2] <==> *(arr+2) <==> *(p+2) <==> *(2+p) <==> *(2+arr) <==> 2[arr]

🌲结构体

在 C语言 中, 结构体 (struct)指的是一种 数据结构 ,是C语言中 复合数据类型的一类。 结构体可以被声明为 变量 、 指针 或 数组 等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。.

参考: zh.wikipedia.org/zh-hans/结构体_(C语言)

简单来说,结构体是一些值的集合,这些值称为成员变量,它们的类型可以不同。

🌼结构体的定义

struct 结构体名

{

        成员变量;

}结构体变量1,结构体变量2;//全局变量

int main()

{

struct 结构体名 成员;//创建了一个对象(局部变量)

}

🌼结构体的赋值

struct 结构体名  成员名={成员变量1,成员变量2,成员变量3};

使用{ }来进行赋值。

struct Stu{//成员变量char name[20];//名字int age;//年龄char id[20];//学号};int main(){//初始化的同时赋值struct Stu s = {"Tom",18,"1050602040"};//创建一个s变量——局部变量return 0;}

🌼结构体成员的访问 

🌱点操作符.  

#include<stdio.h>struct Stu{//成员变量char name[20];//名字int age;//年龄char id[20];//学号}s1,s2;//s1和s2也是创建的结构体变量——全局变量int main(){//初始化的同时赋值struct Stu s = {"Tom",18,"1050602040"};//创建一个s变量——局部变量printf("%s", s.name);return 0;}

🌱->操作符

struct Stu{//成员变量char name[20];//名字int age;//年龄char id[20];//学号}s1,s2;//s1和s2也是创建的结构体变量——全局变量int main(){//初始化的同时赋值struct Stu s = {"Tom",18,"1050602040"};//创建一个s变量——局部变量struct Stu* ps = &s;    //三种调用方法printf("%s
", s.name);printf("%s
", (*ps).name);printf("%s
", ps->name);//先找到成员s,在找到成员变量namereturn 0;}

可以看到,这三种运行结果是一样的。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6YeH5Luj56CB55qE5bCP6JiR6I-H,size_13,color_FFFFFF,t_70,g_se,x_16

 🌼写一个函数打印结构体的内容

🌱方法1:传值调用

//方法1:传值调用void print1(struct Stu t)//打印结构体内容的函数{printf("%s
 %d
 %s
", t.name, t.age, t.id);}int main(){//其余和上方相同print1(s);}

🌱方法2:传址调用(节省空间,推荐)

//方法2:传址调用void print2(struct Stu* ps)//传址调用{printf("%s
 %d
 %s
", ps->name, ps->age, ps->id);}int main(){//其余代码和上方相同    print2(&s);}

 

 

 

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

采代码的小蘑菇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值