数据结构 第2节 地址、参数、结构体复习

所有的指针变量只占4个子节 用第一个字节的地址表示整个变量的地址

#incude 

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 

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;
}

结构体

  1. 为什么需要结构体❓
    为了表示一些复杂的数据,而普通的基本类型变量无法满足要求。

  2. 什么叫结构体
    结构体是用户根据实际需要自己定义的复合数据类型
    结构体给人感觉模拟事物模拟的不彻底(没有方法)。但是仍然好处:以算法为核心。血手结构,算法在面向过程的结构语言里是最好,而面向对象的语言算法就不是其核心了。

  3. 如何使用结构体

#include 

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种变量使用方式

  1. st.age
  2. pst->age pst所指向的结构体变量中的age这个成员
  1. 注意事项
    结构体变量不能相互之间加减乘除,但能相互赋值
    普通结构体变量和结构体指针变量

数据结构是研究数据存储
算法研究数据的操作

你可能感兴趣的:(数据结构 第2节 地址、参数、结构体复习)