day15 C语言 指针3

📅 2026/8/4 6:28:56 👁️ 阅读次数 📝 编程学习
day15 C语言 指针3

13.字符指针的常见错误

#include<stdio.h>

#if 0

int main(int argc, char **argv)

{

//char *p="hello"; //error,会发生段错误 hello在内存中只有一份,只能读取不能修改

char p[]="hello"; //char [] 开辟空间,会把hello复制一份给数组

printf("%s\n",p);

*(p+0)='e'; //如果是指针,操作是错误,不能修改常量

p[0]='e'; //如果是数组,操作是对的,修改的是数组里的内容,不是字符串常量

printf("%s\n",p);

return 0;

}

#endif

void swap(int *a,int *b)

{

int *t; //int t; //此处*t是野指针,没有初始化,所以会发生段错误

*t=*a; //t=*a;

*a=*b;

*b=*t; //*b=t

}

int main(int argc, char **argv)

{

int a=9;

int b=12;

swap(&a, &b);

return 0;

}

14.函数指针,指针函数

1.指针函数:

函数的返回值是指针类型。

eg: char *strcpy(char *dest,const char *src);

strcpy 这个函数的返回值,就是一个指针。 成功,指针指向 dest。

  1. 不能返回是局部作用域的指针。(会被释放)
  2. 希望函数可以连续调用,在同一个语句里面。
  3. 希望返回一端内存区域(数组(首地址)、堆空间)

eg:

char *mystrcat(char *dst,char *src)

{

char *temp=dst;

while(*dst)

{

dst++;

}

while(*src)

{

*dst=*src;

dst++;

src++;

}

*dst='\0';

returntemp; //返回数组首地址

}

int main(int argc, char **argv)

{

char str1[100]="hello";

char str2[100]="ok";

char str3[100]={0};

mystrcat(str3, mystrcat(str1,str2)); //函数可以连续调用,在同一个语句里面。

printf("str3 is %s\n",str3);

return 0;

}

2.函数指针
  1. 本质:指针变量
  2. 函数指针:指向一个函数(前面介绍的指针基本都是指数据)
  3. 函数名:是地址值。里面存储的代码 对数据进行加减乘除操作的。
  4. 目的:避免代码的重复;方便后期代码的拓展;函数功能的解耦合
  5. 回调函数:把一个函数当作参数传给另一个函数,被传递的这个参数(函数指针/回调函数);被动调用。主调函数只是传参(函数)。

eg1:

int add(int a,int b)

{

return a+b;

}

int main(int argc, char **argv)

{

//p是函数指针 add不能写为add(),因为不是对add函数的调用

//定义函数指针p存储add的地址 类似于 int a[10]=0; int *p=a;

int (*p) (int,int)=add;

int a=12;

int b=20;

int ret=0;

ret=add(a,b);

printf("add is %d\n",ret);

ret=p(a,b); //函数本身就算地址 不用加* 通过函数指针对函数的调用

printf("add is %d\n",ret);

return 0;

}

eg2:

int div3(int num) // int (*) (int)

{

return 0==num%3;

}

void find_num(int *a,int size,int (*fun) (int)) //回调函数

{

for(size_t i=0;i<size;i++)

{

if(fun(a[i])) //if(div3(a[i]))

{

printf("%d\n",a[i]);

}

}

}

int main(int argc, char **argv)

{

int a[10]={0};

fill_array(a,10);

//find_num3(a,10);

find_num(a,10,div3);

return 0;

}

15.typedef关键字

取别名,给数据类型取别名

1.普通数据类型取别名

typedef 老的数据类型名 新的数据类型名

typedef unsigned char u8;

typedef unsigned short u16;

typedef char s8;

int main(int argc, char **argv)

{

u8 a; //unsigned char

u16 b; //unsigned short

s8 c; //char

return 0;

}

2.简化函数指针的写法

typedef int* (*PFUN)(int,int,char*);

int* func(int a,int b,char* c) // func的类型int* (*)(int ,int ,char* )

{

return NULL;

}

int func2(int a,int b,PFUN pfun)

{

char str[]={0};

pfun(1,2,str);

return 0;

}

3.和结构体有关