数据结构 第2节 地址、参数、结构体复习
2019-07-18 本文已影响1人
小超_8b2f
所有的指针变量只占4个子节 用第一个字节的地址表示整个变量的地址
#incude <stdio.h>
int main(void) {
double arr[5] = {1.1, 2.2, 3.3, 4.4 ,5.5};
double * p = &arr[0];
printf("%p\n", p); //%p以16进制的形式输出地址(012FF5C)
p = &arr[1];
printf("%p\n", p); //%p以16进制的形式输出地址(012FF64) 64 -5C = 8字节
//int 类型的话差4个,因为int是4字节长度
return 0;
}
如何通过函数修改实参的值
无论要通过函数改写什么类型的值,只需要传递它的地址就行了
#incude <stdio.h>
int main(void) {
int i = 10;
int * p = &i;
printf("%p\n", p);
f(&p);
printf("%p\n", p);
return 0;
}
void f(int ** q) {
*q = (int *) 0xFFFFFFFF;
}
结构体
-
为什么需要结构体❓
为了表示一些复杂的数据,而普通的基本类型变量无法满足要求。 -
什么叫结构体
结构体是用户根据实际需要自己定义的复合数据类型
结构体给人感觉模拟事物模拟的不彻底(没有方法)。但是仍然好处:以算法为核心。血手结构,算法在面向过程的结构语言里是最好,而面向对象的语言算法就不是其核心了。 -
如何使用结构体
#include <stdio.h>
struct Student {
int sid; //不叫属性,叫成员。Java才叫属性
char name[200];
int age;
}; //分号不能省略
int main(void) {
struct Student st = {1, "xiaochao", 22};
printf("%d, %s, %d \n", st.sid, st.name, st.age);
st.sid = 1000; //第一种访问方式
// st.name = "xiaoyi"; error
strcpy(st.name, "lisi"); //Java的内核就是用C和C++写的,所以Java的String实际内部都是这样实现的。
st.age = 28;
struct Student * pst = &st; //第二种方式,最常用
pst->age = 22; //等价于 (*pst).age = st.age
}
//这种方式不好,因为需要>208字节的变量作为参数传递
//耗内存,耗时间
void printStudent(struct Student st) [
printf("%d, %s, %d \n", st.sid, st.name, st.age);
}
//这种方式好,因为只需要4字节的参数变量
void printStudent2(struct Student * st) {
printf("%d, %s, %d \n", st.sid, st.name, st.age);
}
结构体的2种变量使用方式
- st.age
- pst->age pst所指向的结构体变量中的age这个成员
- 注意事项
结构体变量不能相互之间加减乘除,但能相互赋值
普通结构体变量和结构体指针变量
数据结构是研究数据存储
算法研究数据的操作