C语言 day9
2022-06-08 本文已影响0人
y_7539
指针类型的意义
1.指针类型决定了:指针解引用的权限有多大
2.指针类型决定了:指针走一步,能走多远(步长)
int main()
{
int arr[10] = { 0 };
int* p = arr;
char* pa = arr;
printf("%p\n", p);
printf("%p\n", p+1);
printf("%p\n", pa);
printf("%p\n", pa+1);
/*0093FE44
0093FE48
0093FE44
0093FE45*/
}
int main()
{
int arr[10] = { 0 };
int* p = arr;
int i = 0;
for (i = 0;i < 10;i++)
{
*(p + i) = 1;
}
}
避免野指针
1.指针初始化
2.指针指向空间被释放掉后置空
3.小心指针越界
4.指针使用之前检查有效性
指针-指针得到的是两个指针之间的元素个数(前提是两个指针指向同一空间)
int main()
{
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int* p = arr;
printf("%d\n", arr[2]);
printf("%d\n", p[2]); //p[2]->*(p+2)
//2和arr是操作数
printf("%d\n", 2[arr]);
}
int main()
{
int a = 10;
//一级指针
int* pa = &a;
//ppa是二级指针,pa是一个变量。&pa取出pa在内存中的地址
int** ppa = &pa;
//*ppa => pa *pa => a
}
指针数组
整形指针数组 int * pr[5]
结构体
也是一些值的集合,但是值的类型可以不同
struct Student
{
struct S s;
char name[20];
int age;
char id[10];
};
void print1(struct Student st) {
printf("%c %lf %s %d %s \n", st.s.c, st.s.d, st.name, st.age, st.id);
}
void print2(struct Student *stud) {
printf("%c %lf %s %d %s\n", stud->s.c, stud->s.d, stud->name, stud->age, stud->id);
}
int main()
{
struct Student stu = {{'1', 1.11}, "张三", 17, "20202212"};
printf("%c %lf %s %d %s\n", stu.s.c, stu.s.d, stu.name, stu.age, stu.id);
print1(stu); //传值调用
print2(&stu); //传址调用
}
函数调用的参数压栈
函数调用会在内存的栈区开辟一块空间