目录
指针
指针是什么
野指针
野指针的几种情况
如何规避野指针?
指针运算
指针的不同表示
结构体
结构体的定义
结构体的赋值
结构体成员的访问
点操作符.
->操作符
写一个函数打印结构体的内容
方法1:传值调用
方法2:传址调用(节省空间,推荐)
指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。
在 C/C++语言中,指针一般被认为是指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。
————来自"百度百科"
简单来说,指针是一种保存变量地址的变量。
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;}
可以看到,这三种运行结果是一样的。
//方法1:传值调用void print1(struct Stu t)//打印结构体内容的函数{printf("%s
%d
%s
", t.name, t.age, t.id);}int main(){//其余和上方相同print1(s);}
//方法2:传址调用void print2(struct Stu* ps)//传址调用{printf("%s
%d
%s
", ps->name, ps->age, ps->id);}int main(){//其余代码和上方相同 print2(&s);}