霜淮子的c语言程序设计,大家可以通过阅读我的文章学习c语言程序设计的一些基础知识,作者水平有限,如果发现错误,评论区留言!万分感谢!
欢迎订阅专栏《c语言程序设计》
目录
前言
指针也是一种数据类型,既有指针常量,指针有两从含义,既是内存也是地址,也是该地址所存储数据的类型。
8.1、指针
8.1.1、取地址运算
scanf("%d",&i);
&运算符取得变量的地址
获得变量的地址,它的操作数必须是变量
地址的大小是否与int相同取决于编译器
8.1.2、指针变量
计算机里的所有东西都是人做出来的,别人能想得出来,我也一定能想得出来,在计算机里面,没有什么可以模仿,所有得东西只是我现在不知道而已,总有一天,我会把所有的细节,所有的问题都搞明白。
指针
就是保存地址的变量
int i;
int* p=&i;
int* p,q;
int *p,q;
到时候把这个删除了
指针变量
- 变量的值是内存的地址
- 普通变量的值是实际的值
- 指针变量的值是具有实际值的变量的地址
作为参数的指针
- void f(int*p);
- 在被调用的时候得到了某个变量的地址
- int i=0;f(&i);
- 在函数里面可以通过这个指针访问外面的这个i;
8.1.3、指针的使用
指针有什么用
1、交换两个变量的值
void swap(int *pa,int *pb){
int t =*pa;
*pa=*pb;
*pb=t;
}
2、函数返回多个值,某些值就只能通过指针返回
传入的参数实际上是需要保存带回的结果的变量
3、指针最常见的错误
定义了指针变量,还没有指向任何变量,就开始使用指针
用指针来做什么
- 需要传入较大的数据时用做参数
- 传入数组后对数组做操作
- 函数返回值不只一个结果
- 需要用函数来修改不止一个变量
- 动态申请内存……
8.1.4、指针与数组
数组参数
以下四种函数原型是等价的
int sum(int *ar,int n);
int sum(int*,int);
int sum(int ar[],int n);
int sum(int[],int);
数组变量是特殊的指针
- 数组变量本身表达地址,所以
- int a[10];int *p=a;//无需用&取地址
- 但是数组的单元格表达的是变量,需要用&取地址
- a==&a[10]
- []运算符可以对数组做,也可以对指针做;
- *运算符可以对指针做,也可以对数组做
- 数组变量是const的指针,所以不能被赋值
8.2、指针运算
8.2.1、指针运算
给指针+1表示要让指针指向下一个变量
如果指针不是指向一片连续分配的空间,如数组,则这种运算没有意义
指针计算
- 这些算数运算可以对指针做:
- 给指针加、减一个整数
- 递增递减
- 两个指针相减
指针比较
- <,<=,==,>,>=,!=都可以对指针做
- 比较它们在内存中的地址
- 数组中的单元的地址肯定是线性递增的
0地址
- 当然你的内存地址中有0地址,但是0地址通常是个不能随便碰的地址
- 所以你的指针不应该具有0值
- 因此可以用0地址来表示特殊的事情:
- 返回的指针是无效的,
- 指针没有真正初始化(先初始化为0)
- NULL是一个预定定义的符号,表示0地址
- 有的编译器不愿意你用0来表示0地址
指针的类型
- 无论指向什么类型,所有的指针的大小都是一样的,因为都是地址
- 但是指向不同类型的指针是不能直接互相赋值的
- 这是为了避免用错指针
8.2.2、动态内存分配
malloc
void* malloc(size_t size);
- 向malloc申请的空间的大小是以字节为单位的
- 返回的结果是void*,需要类型转换为自己需要的类型
- (int*)malloc(n*sizeof(int))
- 如果没有空间了,返回0或NULL
free()和malloc配套的函数
- 把申请得来的空间还给“系统”
- 申请过的空间,最终都应该要还
- 混出来的,迟早都要还的
- 只能还申请来的空间的首地址
- 申请了没有free——>长时间运行内存逐渐下降
- 对于新手来说,没有这个习惯,忘记了,小的程序可能不太影响,但是如果多次请内存逐渐增多,对于老手来说是找不到合适的free时间
-END-