数组传递【变量传递给子数组】

在指针阶段,会演示整型,浮点型,字符型传递给子数组

字符数组的传递

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. void print(char c[]);
  5. /* 函数调用即赋值:实参传递给形参 */
  6. void print(char d[]) {
  7. int i = 0;
  8. //d[i] != '\0',不需要给 print传递数组长度,因为 char arr[x]以 "\0" 结尾
  9. //d[i] != 0
  10. while (d[i]) {
  11. printf("%c", d[i]);
  12. i++;
  13. }
  14. printf("\n");
  15. }
  16. int main() {
  17. char c[6] = "hello";
  18. print(c); /* 我们称 c 为实参,调用 print() 函数时,把 c 赋值给 d,即 d = c */
  19. return 0;
  20. }

image.png

复习数组访问越界

code

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. void print(char c[]);
  5. /* 函数调用即赋值:实参传递给形参 */
  6. void print(char d[]) {
  7. int i = 0;
  8. //d[i] != '\0',不需要给 print传递数组长度,因为 char arr[x]以 "\0" 结尾
  9. //d[i] != 0
  10. while (d[i]) {
  11. printf("%c", d[i]);
  12. i++;
  13. }
  14. printf("\n");
  15. }
  16. int main() {
  17. char c[5] = "hello";
  18. print(c); /* 我们称 c 为实参,调用 print() 函数时,把 c 赋值给 d,即 d = c */
  19. return 0;
  20. }

image.png

gets()函数

需求分析

scanf() 函数通过 %s 读取输入的字符串,但是遇到空格就会停止读取,怎么样能够将空格视为字符,也读取并且填入字符串数组呢?

c 是一个字符数组,但是编译器给 c 内部存储了一个值, c 里面存储的值,其类型就是一个字符指针

可用替代

  1. fgets(c, sizeof(c), stdin)

读取原理

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int main() {
  5. /* 字符数组的 数组名 内存储的就是 字符数组的起始位置 */
  6. char c[20];
  7. /* 自动将标记输入结束的换行符换成 "\0" */
  8. gets(c);
  9. printf("%s\n", c);
  10. puts(c); /*等价于 printf("%s\n", c);*/
  11. return 0;
  12. }

image.png

strcpy()函数

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. int main() {
  6. char c[10] = "Bye";
  7. char d[10];
  8. printf("字符串长度为 %d. \n", strlen(c));
  9. strcpy(d, c);
  10. /* 将数组元素从 c 拷贝到 d */
  11. printf("拷贝完成之后,字符数组d的遍历.\n");
  12. puts(d);
  13. return 0;
  14. }

image.png

使用 strcpy()拷贝字符常量

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. int main() {
  6. char c[10] = "Bye";
  7. char d[30];
  8. printf("字符串长度为 %d. \n", strlen(c));
  9. strcpy(d, "可以拷贝字符常量"); /* 形式参数有 const 修饰,可以传入常量 */
  10. /* 将数组元素从 c 拷贝到 d */
  11. printf("拷贝完成之后,字符数组d的遍历.\n");
  12. puts(d);
  13. return 0;
  14. }

image.png

strcmp()函数

两个字符常量完全一样,函数返回值为1

image.png

字符串常量不同,且第一个参数首先出现 ascⅡ码值较大的情况,输出为 1

image.png

strcat()字符串拼接,用于追加的字符数组必须大于等于原始数组长度之和

image.png

指针

指针的本质

image.png

取地址与取值

& 为取地址运算符,也称引用;
*取值运算符,也称解引用;
两种运算符的优先级相同;

指针变量的声明

  1. int *a, *b, *c;

直接访问与间接访问

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. /* 指针的本质就是存储地址 */
  6. int main() {
  7. int i = 5;
  8. int* p = &i; /* 指针类型的变量如何赋予初值? */
  9. printf("%d\n", i); /* 直接访问 */
  10. printf("*p = %d\n", *p); /* 通过解引用,读取指针指向的变量的值 */
  11. return 0;
  12. }

image.png

指针的使用场景—-> 传递与偏移

二级指针的传递