标签:输出 函数地址 应该 efault 效果 本地变量 ++ main 定义
指针作为函数的参数
指针作为函数的返回值
int* test();
int main(){
// 指针作为函数的返回值,一定要返回一个局部变量依然还存在的地址
int *arrNum = test();
for (int i = 0; i < 4; i++) {
printf("arrNum[%i] = %i\n",i,arrNum[i]);
}
return 0;
}
int* test(){
int arr[] = {1,2,3,45}; // 这是一个局部变量的数组,在程序运行完这个 test 函数后,该函数的内存地址就销毁了,虽然将数组 arr 的第一个字节地址返回了,但是此时已经不知道该地址指向了哪个值了
return arr; // 将局部变量 arr 数组的地址返回,使用j指针接收
}
// 报错:Address of stack memory associated with local variable ‘arr‘ returned返回的与本地变量“arr”相关联的堆栈内存地址
解决办法:既然要返回一个还存在的内存地址,那么就将局部变量申请在堆空间中.申请在堆中的内存地址只有在 free()时和程序结束的时候才会回收
int* Test();
int main(){
int *arrNum = Test();
for (int i = 0; i < 3; i++) {
printf("arrNum[%i] = %i\n",i,arrNum[i]);
}
free(arrNum); // 释放掉堆中申请的内存
return 0 ;
}
// 返回的指针为堆空间中的指针
int* Test(){
int* arr = calloc(3, sizeof(int));
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
return arr;
}
// 控制台输出:
arrNum[0] = 10
arrNum[1] = 20
arrNum[2] = 30
char* getWeek(int num);
char* getWeekTwo(int num);
char* getWeekThree(int num);
int main(){
// 写一个函数,传入 1-7 之间的数字,返回对应的星期几
char* week = getWeek(8);
char* weekTwo = getWeekTwo(4);
char* weekThree = getWeekThree(5);
printf("今天是:%s\n",week);
printf("今天是:%s\n",weekTwo);
printf("今天是:%s\n",weekThree);
return 0;
}
char* getWeekTwo(int num){
switch (num) {
case 1:
return "星期一"; // 因为这个字符串就是存储在常量区的,返回常量区的地址,函数执行完常量区也还存在,并不是消失了
break;
case 2:
return "星期二";
break;
case 3:
return "星期三";
break;
case 4:
return "星期四";
break;
case 5:
return "星期五";
break;
case 6:
return "星期六";
break;
case 7:
return "星期日";
break;
default:
return "输入错误";
break;
}
};
char* getWeekThree(int num){
char* week = "未知";
switch (num) {
case 1:
week = "星期一"; // 因为这个字符串就是存储在常量区的,返回常量区的地址,函数执行完常量区也还存在,并不是消失了
break;
case 2:
week = "星期二";
break;
case 3:
week = "星期三";
break;
case 4:
week = "星期四";
break;
case 5:
week = "星期五";
break;
case 6:
week = "星期六";
break;
case 7:
week = "星期日";
break;
default:
week = "输入错误";
break;
}
return week;
};
char* getWeek(int num){ // 最好不要用这种,返回字符串的时候
char* week = calloc(12, sizeof(char)); // 从堆内存申请空间,但是一定要记住要释放对空间
switch (num) {
case 1:
return week = "星期一";
break;
case 2:
return week = "星期二";
break;
case 3:
return week = "星期三";
break;
case 4:
return week = "星期四";
break;
case 5:
return week = "星期五";
break;
case 6:
return week = "星期六";
break;
case 7:
return week = "星期日";
break;
default:
return week = "输入错误";
break;
}
};
int num = 10;
int *p1 = #
程序在运行的时候,会将程序加载到内存,程序中主要有代码/指令
代码段中主要存储程序的代码,而程序的代码就包括函数,所以函数肯定要存储在内存的代码中,既然函数要存储在内存中,暗恶魔肯定要用一块空间,那么这个空间肯定有地址,那么我们就可以声明一个指针存储这个函数的地址,让这个指针间接的调用这个函数
使用指针来间接调用函数
指向函数的指针声明
一个贺子珍函数的指针,并不是任一的函数都可以指向,而是有限定的,要求指向的函数的返回值类型与参数描述必须要与指针的描述一样
声明语法
指向函数的指针初始化
如何使用指针调用指向的函数呢
小技巧:如果要定义一个指针指向 1 个函数,拷贝这个函数头,删除函数名,用小括号代替,里面写上*加指针名称
void defFun();
int sum(int num1 ,int num2);
int main(){
// 指针指向函数
void (*p1)() = defFun;
p1();
(*p1)();
int (*qiuhe)(int num1, int num2) = sum; // 声明一个指针叫做 qiuhe,指向一个int 类型的返回值,有两个参数,两个参数的类型都是 int 类型的函数,将 sum 函数的地址赋值给这个指针,进行初始化
qiuhe(1,2);
(*qiuhe)(3,4);
return 0;
}
void defFun(){
printf("这是一个被指针指向的函数\n");
}
int sum(int num1,int num2){
int sum = num1+num2;
printf("sum = %i\n",sum);
return num1+num2;
}
标签:输出 函数地址 应该 efault 效果 本地变量 ++ main 定义
原文地址:https://www.cnblogs.com/shanshan-test/p/13121250.html