C语言程序设计(22)

50 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天,点击查看活动详情

指针比较

<,<=,==,>,>=,!=都可以对指针做;

比较它们在内存中的地址;

数组中的单元的地址肯定是线性递增的。

0地址

内存中是存在0地址的,但是0地址通常是那个不能随便碰的地;

所以指针不应该具有0值;

因此可以用0地址来表示特殊的事情:

返回的指针是无效的,指针没有被真正的初始化(在程序中定义指针可以先将其初始化为0);

NULL是一个预定定义的符号,表示0地址(有点编译器不愿意你用0来表示0地址)。

指针的类型

无论指向什么类型,所有指针的大小都是一样的,因为都是地址;

但是指向不同类型的指针是无法直接相互赋值的;

这是为了避免用错指针。

指针的类型转换(初学者不建议轻易尝试)

void表示不知道指向什么东西的指针,计算时与char相同,但不相通;(void主要用在底层程序和系统程序中,直接访问某个内存地址)

指针也可以类型转换:int *p=&i;void *q=(void *)p;

这并没有改变p所指的变量的类型,而是让别人用不同的眼光通过p看它所指的变量(从q的角度出发了,不再将i当作int,而是看作void)。

用指针来做什么

需要传入较大的数据时用作参数;

传入数组后对数组做操作;

函数不止返回一个结果;

需要用函数来修改不止一个变量;

动态申请的内存。

动态内存分配

输入数据

如果输入数据时,先告诉你个数,然后再输入,要记录每个数据。

C99可以用变量来做数组定义的大小,那在这之前呢?

需要动态分配内存:int a=(int)malloc(n*sizeof(int));

要用到malloc需要头文件:#include<stdlib.h>。