数据结构指针复习:
#include <stdio.h> void main() { int a[5] = {8, 2, 3, 4, 5}; // a[3] == *(3+a) printf("%d ", *(3+a)); // a[3] 4 printf("*a其实就是a[0]: %d ", *a); // 8 // 地址是连续的 printf("%p ", a+1); printf("%p ", a+2); printf("%p ", a+3); }
一维数组名是个指针常量,它存放的是一维数组第一个元素的地址,它的值不能被改变,
一维数组名指向的是数组的第一个元素的地址。(获取)修改一个数组,就是要把数组的第一个元素的地址和数组的长度传递进去就行了。
#include <stdio.h> void Show_Array(int *p, int len) { p[0] = -1; int i; for(i = 0; i < len; i++) { p[i] = p[i] + 1; printf("%d ", p[i]); } } int main(void) { int a[5] = {1, 2, 3, 4, 5}; Show_Array(a, 5); // a等价于&a[0], &a[0]本身就是int *类型 return 0; }
通过函数修改实参的值:
#include <stdio.h> void f(int *p) { *p = 99; } int main(void) { int i = 10; f(&i); printf("%d ", i); return 0; }
结构体使用概述:
结构体只有属性,没有方法。结构体是类的一个过渡。
为什么会出现结构体?
为了表示一些复杂的数据,而普通的基本类型无法满足要求。
什么叫结构体?
结构体是用户根据实际需要自己定义的复合数据类型。
#include <stdio.h> #include <string.h> struct Student // 定义了一个新的数据类型 { int sid; char name[200]; int sage; }; // 分号不能省 int main(void) { // 定义一个数据类型是struct Student的变量st struct Student st = {1000, "zhangsan", 20}; printf("%d %s %d ", st.sid, st.name, st.sage); st.sid = 99; strcpy(st.name, "lisi"); st.sage = 22; printf("%d %s %d ", st.sid, st.name, st.sage); return 0; }
#include <stdio.h> struct Student { int sid; char sname[200]; int sage; }; int main(void) { struct Student st = {1000, "zhangsan", 20}; // st.sid // 定义一个指针变量 struct Student *pst; pst = &st; pst->sid = 99; // 等价于(*pst).sid, st.sid return 0; }
结构体的实现,两种方式:
struct Student st = {1000, "zhangsan", 20};
struct Student *pst = &st;
1. st.sid
2. pst->sid
pst所指向的结构体变量中的sid这个成员
pst是指向结构体变量的指针,*pst就是st
int *p;
p是指针变量,*p是普通变量。
注意:
结构体变量不能加减乘除,但可以相互赋值
普通结构体变量和结构体指针变量作为函数传参的问题