指针
- 指针是什么
指针就是地址,通过它可以找到地址的内存单元。
其在32位电脑里大小是4个字节,在64位电脑里是8个字节。
指针和指针类型
变量有不同的类型,有整形,浮点型,字符型,而作为指向地址指针,也是有的。
指针加减整数的意义是什么?
指针加减整数的意义是向其前或者后面走一个地址的大小。
而这个地址的大小就是由指针类型决定。
- 野指针
成因:
指针未初始化
指针越界访问
指针指向的空间释放
如何规避野指针?
指针初始化
避免越界:
指针指向空间放置NULL
指针在使用前检查其有效性
如:
int main()
{
int *p = NULL;
int a = 10;
p = &a;
if (p != NULL)
*p = 20;
return 0;
}
小知识:
同一连续的地址让指针分别指向前一个地址和后面的地址,俩个指针相减的差值为俩个地址的距离。
指针和数组结合
指针数组:
char* p[10];
对比与“好孩子”,所以其还是数组,只是数组里面放的是10个指针。
- 数组指针:
char(*p)[10];
表示的是一个数组,其申请了10个地址。
- 二级指针
int a = 10;
int *pa = &a;
int **ppa = &pa;//二级指针
int ***pppa = &ppa;//三级指针
- 结构体
结构体的声明:
struct tag
{
member-1ist
}variable-1ist;
member成员变量可以是标量,变量,数组,指针,结构体。
variable为其非成员变量。
- 初始化:
variable - 1ist = { 0 };
- 访问:
点引用。
若为*variable - 1ist 使用->引用。
注意:
在使用函数传结构体时,尽量利用指针,因为函数传参需要压栈,如果结构体过大,参数的系统开销较大,会导致性能下降。
- [ ] 喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。
#define _CRT_SECURE_NO_WARINGS 1
#include<stdio.h>
int main()
{
int sum = 0;
int m = 0;
flag1:
printf(" 喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,输入你有多少钱。\n");
scanf_s("%d", &m);
sum = m;
while (m>1)
{
if (m % 2 == 0)
{
m = m / 2;
sum += m;
}
else
{
m = m / 2;
sum += m;
m = m + 1;
}
}
printf("你可以喝到%d瓶汽水\n\n\n", sum);
printf("再来小可爱\n");
goto flag1;
return 0;
}