#include<stdio.h>
int main()
int arr[5] = { 1,2,3,4,5 };
int* p = arr;
printf("%d\n", *p);
printf("%d\n", *(p + 1));
printf("%d\n", *(p + 2));
return 0;
arr指的是首元素的地址,存放在指针变量p上,我们*p就可以找到数组的第一给元素,那么*(p+1)指的又是上面呢,其实他指的是跳过一个4个字节,为什么是4个字节而不是一个字节呢,这就跟指针变量的类型有关系了,因为p是int*s是4个字节,如果是char*我们+1又会发生什么呢?
这时我们观察到打印了0,我们*(p+4)才早的数组的第二个元素,这是因为数组arr中的每个元素都是4个字节的,而char*p类型的指针加1只能跳过1个字节,这时候找的首地址就不对了。
3 野指针
概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
3.1 野指针的成因
1指针未初始化
2指针越界访问
3指针指向的空间释放
这里虽然可以打印出6来,但这样的访问是非法的,因为形参在出函数就会销毁。
3.2 如何避免野指针的出现
1. 指针初始化
2. 小心指针越界
3. 指针指向空间释放即使置NULL
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性
其中我们可以养成一个习惯,当我们不知道给指针初始化何值时,我们可以初始化指针为NULL(0),在对指针赋值的时候在判断一下,就可以一定程度上避免野指针。
4 二级指针
简单的说就是存放一级指针的地址
图中ppa便是二级指针变量,存的一级指针变量的地址。
5 指针数组
存放指针的数组,指针数组本质是数组。
其中的parr变是指针数组,其中parr[10]等价于*(parr+10);
指针数组可以模拟一个二维数组
6 结构体
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
6.1 结构的声明
struct tag
member-list;
}variable-list;
struct:是结构体类型的关键字
struct tag:是用户定义的结构体类型
member-list:是结构体成员
variable-list:结构体类型变量
其中结构的成员可以是标量、数组、指针,甚至是其他结构体。
6.2 结构体变量的定义和初始化
结构体变量的定义就是给结构体类型取一个变量。
结构体的初始化
6.3 结构体的访问
结构体变量成员用 .访问
结构体变量指针->访问
6.4 结构体传参
传参有二种,但对于结构体来说传址调用是最好的,
函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
所以:结构体传参的时候,要传结构体的地址。
到此这篇关于C语言深入讲解指针与结构体的使用的文章就介绍到这了,更多相关C语言指针与结构体内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
2006-2023 脚本之家 JB51.Net , All Rights Reserved.
苏ICP备14036222号