第9章 指针

9.1 指针

9.1.1 指针的所用

一,用于改变外面的变量

#include <stdio.h>

void change(int *a, int *b) {
    int t;
    t = *a;
    *a = *b;
    *b = t;
}

int main() {
    int a, b;
    a = 5;
    b = 6;
    change(&a, &b);
    printf("a%d, b=%d", a, b);
    return 0;
}

二,需要改变多个变量

#include <stdio.h>

void change(int *max, int *min, int arr[], int len) {
    *max = *min = arr[0];
    int i;
    for(i=0;i<len;i++) {
        if(*max<arr[i]) *max = arr[i];
        if(*min>arr[i]) *min = arr[i];
    }
}

int main() {
    int max, min;
    int arr[] = {3, 9, 10, 11, 1, 2, 99, 88, 22, 8};
    change(&max, &min, arr, sizeof(arr)/sizeof(arr[0]));
    printf("max=%d, min=%d", max, min);
    return 0;
}

应用场景b

  • 函数返回运算的状态,结果通过指针返回
  • 常用的套路是让函数返回特殊的不属于有效范围内的值来表示出错
    • -1或0(在文件操作会看到大量的例子)
  • 但是当任何数值都是有效的可能结果时,就得分开返回了
    • 在后续的语言(C++,Java)采用了异常机制来解决这个问题

应用

#include <stdio.h>

int main() {
	int a[] = {5, 7, 1, 8, 2, 9, 10, -1};
    int *p = a;
    while(*p!=-1) printf("%d", *(p++));
	return 0;
}

常犯错误

  • 定义了指针变量,还没有指向任何变量就开始使用指针(例如赋值什么的)

9.1.2 指针与const

9.2 指针运算与内存

9.2.1 指针运算

指针访问数组

int a[] = {5, 7, 1, 8, 2, 9, 10, -1};
int *p = a;
while(*p!=-1) printf("%d", *(p++));

9.2.2 动态内存分配

输入数据

  • 在我们定义数组时,必须给它一个确定的数,这个数可以是变量,也可以是常数(C99后的写法)

  • 那么在C99前呢?

    int *a = (int*)malloc(n*sizeof(int));//malloc函数的实参是计算占多少字节
    

malloc

  • #include <stdlib.h>

    void* malloc(size_t size);

  • 向malloc申请的空间的大小是以字节位单位的

  • 返回的结果是void*,需要类型转换为自己需要的类型

    (int*)malloc(n*sizeof(int));
    

没空间了?

  • 如果申请失败则返回0,或者叫做NULL

  • 你的系统能给你多大的空间?

    int main() {
    	void *p;
    	int cnt = 0;
    	while((p=malloc(100*1024*1024))){
    		cnt++;
    	}
    	printf("分配%d00MB空间", cnt);
    
    	return 0;
    }
    

free()

  • 把申请得来的空间还给“系统”

  • 申请过的空间,最终都应该要还

    • 混出来的,迟早都是要还的
  • 只能还申请来的空间的首地址

    //测试
    int main(void) {
        void *p;
        int cnt = 0;
        p = malloc(100*1024*1024);
        p++;
        free(p)
    }
    
    • 直接终止了

常见问题

  • 申请了没free-》长时间运行内存逐渐下降
    • 新手:忘了
    • 老手:找不到合适的free的时机
  • free过了再free
  • 地址变过了,直接去free

项目:五子棋

功能

  • 输入坐标

9.3 字符输入输出与数组

9.3.1 单字符输入输出

代码

int ch;
while((ch=getchar())!=EOF) {
    putchar(ch);
}

9.3.2 字符串数组

二维数组

char *a[] = {""};//这个是指向
赞赏