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;}

结构体成员的访问 

点操作符.  

#includestruct 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;}

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

C语言——指针初阶、结构体初阶_第1张图片

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

方法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);}

 

 

 

 

你可能感兴趣的:(C语言,c语言,开发语言)