【学习记录】c 指针相关

学习过程中记录一下重要内容,摘出内容来自[原帖]

指针与字符串

  • 字符指针常量
    eg: "string"表示一个字符指针常量,该指针指向字符串首字符 ‘s’ 。

  • 因为是常量,因此该指针不可以修改或自增自减也不可对字符串内容进行修改

  • 其他用法和普通指针一样,‘string’+i 表示从‘s’往后数i个单位所存储的字符。

  • 使用 puts() 和 printf(%s)进行输出时,若使用字符指针常量,会直接输出指针所指向的整个字符串。

  • 若使用printf(%c),输出的是单个字符。此时不能直接用字符指针常量,需要使用 * 访问指针指向地址内容

puts("abdes"+1);//puts输出字符串
//输出结果是字符串"bdes",从(‘a’+1)开始直到字符串结束
printf("%s\n","dsfd"+2);//%s输出字符串
//输出结果是字符串是"fd",从('d'+2)开始直到字符串结束
printf("%c\n","acdw"+1);//%c输出单个字符
//输出结果是空白,这种输出方式是错误的
printf("%c\n",*("acdw"+1));//加上*访问地址内容才有输出结果
//输出结果是单个字符'c',即('a'+1)地址所指向内容
  • 字符指针变量
  • 使用指针变量指向字符串常量时
    可以修改指针,但不可使用指针修改字符串内容。
    即可以让修改p,让p指向另一个字符串,但是不可改变利用p来将"hello "中的字符修改。
char *p="hello";
char *p1="dsafa";
p='u';//错误,不可修改常量字符串内容
p=p1;//正确,可以改变p的指向
  • 字符数组
    关于字符串结束标志,如果字符串缺少结束标志,使用一些字符串相关操作函数可能会出现问题
char a[4]="dsjf";//此时缺少字符串结束标志‘\0’,编译器会报错
char a[5]="dsjf";//正确
char b[5];//数组未赋值时,每一位都是‘\0’

使用这种方式定义的字符数组内容可以通过指针对字符串内容进行修改

char a[5]="dsjf";
a[3]='h';//修改字符串内容,可行
char *p;
p=a;
*p='h';//修改字符串内容,可行

指针与函数

  1. 指针函数【函数的一种类型,本质是函数】
    函数的返回类型为指针,在字符串处理函数中尤为常见
int *p(int *a,int *b)//返回值类型为指针
{
	……
	return a;//返回值不是*a,因为a是才是指针/地址,而*a是a所指内存单元内的数据
}
  1. 函数指针【本质是个指针】
    将函数的首址保存在指针中,通过指针使用函数。
int f (int a);
int (*pf) (int); 
pf=f;
pf=&f;//两种方式均可

int result;
result=f(2); //正确。编译器会把函数名转换成对应指针
result=pf(2); //正确。直接使用函数指针
result=(*pf)(2); //正确。先把函数指针转换成对应函数名

函数指针通常主要用于作为函数参数的情形,也就是作为一个函数的参数来使用,在一个函数中调用另一个函数。
由于指针可以修改指向,所以这个被调用的函数可以根据需要进行替换。
替换指向的函数是使用函数指针的目的,否则完全可以直接调用函数而不需要使用指针。【个人理解】

//计算器函数
void cal (int (*pf) (int, int) , int op1, int op2)
{
    pf (op1,op2) ;//这里的pf可以在程序中进行修改为别的函数。
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值