1. 复习

只要把地址拿到就能这么操作.. (这里是合法的地址,不是野指针)

C语言基础 (9) 数组指针

 

  1. 只有定义变量后,此变量的地址才是合法的地址
  2. 野指针就是保存没有意义地址的指针变量
  3. 操作野指针变量本身不会有任何问题
  4. 操作野指针所指向的内存才导致段错误

(操作系统的内存不是你想用就用的)

 

C语言基础 (9) 数组指针

 

 

0 ‘\0’ NULL是一个东西

 

02 作业讲解

 

03 指针数组

指针数组 它是数组

 

03 数组指针

 

int *p[10];

C语言基础 (9) 数组指针

(!注意: char *a, int *b, double *c 的size of 都是4

        应该是根据编译器 就像void* 长度是由编译器决定的

 

04 值传递

 

05 地址传递

 

值传递就是把内存中的那部分内容传递了一份(也就是复制了一份

引用传递是把地址传递过去

 

C语言基础 (9) 数组指针

 

06 形参中的数组

 

// 形参中的数组,不是数组,它是普通指针变量

// 形参数组 int a[100000] int a[] int *a对编译器而言,没有任何区别

// 编译器都是当作int *处理

// 形参中的数组和非形参数组区别:

// void print_array[int a[100000]]

// void print_array(int a[]) 

 

C语言基础 (9) 数组指针

 

C语言基础 (9) 数组指针

 

07 返回局部变量的地址

 

指针数组,它是数组,每个元素都是指针

数组指针,它是指针,指向数组的指针 (就业班 这里不讲)

 

int b[10][10]

 

fun(b)

 

void fun(int b[10][10]); // ok

void fun(int **p); //err,二维数组不是二级指针

 

int *fun(); //返回值是指针类型,指针函数

C语言基础 (9) 数组指针

 

 

(这段代码在不同编译器下表现不一样,主要是局部函数中的变量地址 当函数结束时是否被释放, 所以建议不要引用局部函数中的变量地址

 

8 返回全局变量地址

 C语言基础 (9) 数组指针

 

C语言基础 (9) 数组指针

 

9 字符串打印说明

 C语言基础 (9) 数组指针

 

 

10 上午知识点复习

 

11 字符指针

 

12 字符串拷贝问题

C语言基础 (9) 数组指针

 

 

13 字符串拷贝功能的实现

 

C语言基础 (9) 数组指针

 

14 课堂答疑

 

15 const修饰的字符指针

 

16 字符串常量

 

C语言基础 (9) 数组指针

 

 

17 文字常量区不允许修改

 

C语言基础 (9) 数组指针

打印出来是一样的

 

C语言基础 (9) 数组指针

 

 

// 2、字符串常量,文字常量区的字符串,只读,不能修改

 

C语言基础 (9) 数组指针

C语言基础 (9) 数组指针

 

还有一种要注意的错误:

 C语言基础 (9) 数组指针

(段错误)

 

 

18 文字常量区不能修改2

 

19 字符串常量初始化问题

C语言基础 (9) 数组指针

 

20 main形参使用说明

 C语言基础 (9) 数组指针

 

 C语言基础 (9) 数组指针

 

 

注意:两个**的不是接二维数组的,是接指针数组的

C语言基础 (9) 数组指针

C语言基础 (9) 数组指针

 

讲一下main函数的参数:

 

C语言基础 (9) 数组指针

发现其实和之前的是一个套路:

 

C语言基础 (9) 数组指针

 

C语言基础 (9) 数组指针

 

(第0个参数 第1个参数 第2个参数…

 

在继续深入..

C语言基础 (9) 数组指针

 

cp和mv就是C语言写的

后面就是传的参数

 

21 课堂答疑

 

C语言基础 (9) 数组指针

(如果printf %x a和&a[0] 是同一个地址

但是sizeof的时候结果是不一样的

 

22 查找匹配字符串出现次数

C语言基础 (9) 数组指针

 

23 两头堵模型

 

#include <stdio.h>

#include <string.h>

 

int main(int argc, char const *argv[])

{

    char *p = "       123456789        ";

    char *start = p;               // 首元素地址

    char *end = p + strlen(p) - 1; // 尾元素地址

 

    // 从左往右

    while (*start == ' ' && *start != '\0')

    {

        start++;

    }

 

    // 从右往左     注意这个 end!=p 简直骚操作

    while (*end == ' ' && end != p)

    {

        end--;

    }

 

    int n = end - start + 1;

 

    printf("n = %d\n", n);

 

    char buf[100] = "aaaaaaaaaaaaaaaaaaa";

    strncpy(buf, start, n);

 

    buf[n] = 0; // 结束符

    printf("buf = %s\n", buf);

 

    return 0;

}

 

 

24 作业

 

相关文章: