给指针变量赋值,可以是字符串,也可以是字符数组,前者可读不可写,后者可读写

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int main() {
  5. //相当于将数据放在公共区域 const类型变量,可读不可写
  6. char* p = "hello"; // 把字符串类型的常量 "hello" 的首地址赋值给 p
  7. char c[6] = "hello"; // 等价于 strcpy(c, "hello") 本质是将数据拷贝到栈空间,而栈空间是可读可写的
  8. c[0] = 'H';
  9. p[0] = 'H'; // 不可以对常量去数据进行修改
  10. printf("c[0] = %c\n", c[0]);
  11. printf("p[0] = %c\n", p[0]);
  12. p = "world"; // 将字符串 world 的地址赋值给 p
  13. //c = "world"; // 非法
  14. return 0;
  15. }

image.png

二级指针

一级指针取地址,二级指针取地址的地址,也就是说一级指针就像藏宝图,找到藏宝图就保存了宝贝的地址,而二级指针相当于指示藏宝图地址的碎片;在画江湖里面,一级指针就是指向龙脉的藏宝图,二级指针就是指向藏宝图的温韬;

二级指针的初始化,一定是某个一级指针的地址;

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. void change(int** p, int* pj);
  5. void change(int** p, int* pj)
  6. {
  7. int i = 5;
  8. // 对 p:二级指针解引用,得到一级指针 pi指向变量的地址
  9. // pj 是指向 变量5 的地址的指针,将该指针指向解引用后的二级指针,修改指针的直接指向
  10. *p = pj; // 将 pj 的值,赋值给 p
  11. }
  12. /// 这部分对于考研不重要,记忆一下即可,初试和机试都不用
  13. /// 想要在子函数中改变一个变量的值,必须把该变量的地址传进去
  14. /// 想要在子函数中改变一个指针变量的值,必须把该指针变量的值传进去
  15. int main() {
  16. int i = 10;
  17. int j = 5;
  18. int* pi;
  19. int* pj;
  20. pi = &i;
  21. pj = &j;
  22. printf("i = %d, *pi = %d, *pj = %d¥\n", i, *pi, *pj); // i & *pi都是10,*pj是5
  23. // 第一个参数:接受二级指针【地址】, 其值为一级指针【指向数值10的指针】的地址
  24. // 第二个参数:接受一级指针:其指向数值5的地址;
  25. change(&pi, pj);
  26. printf("after change i = %d, *pi = %d, *pj = %d¥\n", i, *pi, *pj);
  27. return 0;
  28. }

函数声明,定义与调用

全局变量

定义在函数中的形参,如果没有函数调用,那么并不占用内存中的存储单元。只有函数发生函数调用时,函数print中的形参才会被分配内存空间

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int i = 10; // 定义全局变量
  5. void print(int a);
  6. void print(int a)
  7. {
  8. printf("print i = %d\n", i);
  9. }
  10. int main() {
  11. printf("main i = %d$\n", i);
  12. i = 5; // 局部变量修改全局变量,并且将其传入子函数中
  13. print(i);
  14. return 0;
  15. }

递归调用

我调用我自己

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int recursion(int k);
  5. int recursion(int k)
  6. {
  7. if (k == 1)
  8. {
  9. return 1;
  10. }
  11. if (k > 69)
  12. {
  13. printf("you can only input value among of 0 ~ 69");
  14. exit(1);
  15. }
  16. return k * recursion(k - 1);
  17. }
  18. int main() {
  19. int n;
  20. scanf_s("%d", &n);
  21. printf("the value of input = %d\n", n);
  22. int result = recursion(n);
  23. printf("factorial = %d\n", result);
  24. exit(0);
  25. }