指针与字符串
指针应用场景
- 交换两个变量的值
//交换两个变量的值的函数
void swap(int *pa,int*pb) //定义两个指针变量
{
int t = *pa;
*pa = *pb;
*pb = t;
}
- 函数返回多个值,某些值就只能通过指针返回
- 传入的参数实际上是需要保存带回的结果的变量
#include <stdio.h> void minmax(int a[],int len,int *max,int *min); int main(void) { int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55}; int min,max; minmax(a,sizeof(a)/sizeof(a[0]),&min,&max); printf("min = %d,max = %d\n",min,max); return 0; } void minmax(int a[],int len,int *min,*max) { int i; *min = *max =a[0]; for (i=1;i<len;i++) { if(a[i]<*min) { *min = a[i]; } if (a[i]>*max) { *max = a[i]; } } }
- 函数返回运算的状态,结果通过指针繁华
- 常用的套路是让函数返回特殊的不属于有效范围内的值来表示出错
- -1或0(在文件操作会看到大量的例子)
- 但是当任何数值都是有效的可能结果时,就得分开返回了。(状态用函数的return来返回,实际的值用指针参数来返回)
*代码实例
#include<stdio.h>
//如果除法成功,返回1;否则返回0.
int divide(int a,int b,int *result);
int main(void)
{
int a =5;
int b =2;
int c;
if (divide(a,b,&c))
{
printf("%d/%d=%d\n",a,b,c);
}
return 0;
}
int divide(int a,int b,int *result)
{
int ret = 1;
if(b == 0) ret = 0;
else
{
*result = a/b;
}
return ret;
}
*指针使用常见错误:定义了指针变量,还没有指向任何变量,就开始使用指针。
数组与指针的关系
- 函数参数表中的数组实际上是指针
- sizeof(a) = sizeof(int *)
- 但是可以用数组的运算符[]进行运算
- 以下四种函数原型是等价的:
- int sum(int *ar,int n);
- int sum(int *,int);
- int sum(int ar[],int n);
- int sum(int [],int);
指针运算
- 给指针加、减一个整数,这里的操作其实是将指针的位置发生所加或所减个sizeof()个单位。
- 递增递减运算:移到下一个位置,或上一个位置
- 关于*p++
- 去除p所指的那个数据来,然后顺便把p移到下一个位置去
- *的优先级虽然高,但没有++高
- 常用于数组这类连续空间的数据类型
- 在某些cpu上,这可以直接被翻译成一条汇编指令
*指针的比较运算 - 比较它们在内存中的地址
- 数组中的单元的地址肯定是线性递增的
- 0地址
- 0地址通常是个不能随便碰的地址
- 所以指针不应该具有0值
- 可以用0地址来表示特殊的事情:
- 返回的指针是无效的
- 指针没有被真正初始化(先初始化维0)
- NULL(必须是全大写)是一个预定定义的符号,表示0地址(但是并不能因此认为与 0等同)
- 有的编译器不愿意你用0来表示0地址
- 指针的类型
- 无论指向什么类型,所有的指针的大小都是一样的,因为都是地址
- 但是指向不同类型的指针是不饿能直接互相赋值的,这是为了避免用错指针
- 用指针来做什么
- 需要传入较大的数据时用作参数
- 传入数组后对数组做操作
- 函数返回布置一个结果,需要用函数来修改不止一个变量
- 动态申请的内存
动态内存分配
- 需要#Include<stdio.h>的头文件
- 应用格式: void* malloc(size_t size);
- 向malloc申请的空间大小是以字节为单位的
- 返回的结果是void*,需要类型转化为自己需要的类型
- 例如:(int*)malloc(n*sizeof(int))
- 在使用完毕以后,需要将从malloc借的空间还回(使用free()即可)
字符串操作
- putchar函数
- 格式:int putchar(int C);一次只接受一个字符
- 功能:向标准输出写一个字符
- 返回值:返回写了几个字符,EOF(-1)表示写失败
- getchar 函数
- 格式:int getchar(void)
- 功能:从标准输入中读入一个字符
- 返回类型是int 是为了返回EOF(-1)
- Window—>Ctrl + Z
- UNIX —>Ctrl + D
- 字符串数组
- char**a
- a是一个指针,指向另一个指针,那个指针指向一个字符(串)
- char**a