指针与字符串

指针与字符串


指针应用场景

  • 交换两个变量的值
//交换两个变量的值的函数
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是一个指针,指向另一个指针,那个指针指向一个字符(串)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值