//1、malloc指针转化
#include <stdio.h>
#include <string.h>
int main() {
char* p[5];
char arr[5][10] = { "hello", "abc", "world", "ab", "wangdao" };
int i, j, count;
char* tmp;
char** p2;
//向这个空间中的元素存储指针,存储为char*
//使用动态的指针数组,必须把一级指针强转成二级指针
p2 = (char **)malloc(count * sizeof(char*)); //将void*指针强转成二级指针
for (i = 0; i < 5; i++) {
p[i] = arr[i];
}
return 0;
}
//2、动态开辟二维数组
#include <stdio.h>
int main() {
int iRow;
char (*p)[10];
scanf("%d", &iRow); //堆区开辟二维数组的使用
p =(char(*)[10])malloc(10 * iRow); //需要用到数组指针
strcpy(p[0], "lili");
strcpy(p[1], "xiongda");
return 0;
}
//3、函数指针
void fnPrinta() {
printf("I am fnPrinta\n");
}
void fnPrintb(void (*p)()) {
p(); //调用你传递给它的行为
}
typedef void (*pfunc)();
void f1() {
putchar(1);
}
void f2() {
putchar(2);
}
void f3() {
putchar(3);
}
#include <stdio.h>
int main() {
void (*p)(); //需要给函数传递一个行为时就需要使用函数指针
pfunc funcArr[3] = {f1, f2, f3}; //函数指针数组
for (int i = 0; i < 3; i++) {
funcArr[i](); //循环在执行定义的三个函数
}
p = fnPrinta;
fnPrintb(p);
return 0;
}
//4、函数的嵌套调用
#include <stdio.h>
#include <setjmp.h>
jmp_buf envbuf; //jmp_buf为一个结构体,用来存储寄存器之前的一个状态
void b() {
printf("I am func b\n");
longjmp(envbuf,2); //回到envbuf保存的状态,第二个参数是setjmp的返回值,由自己定义
} //但不能填0,如果填0,setjmp返回值强制转成1
void a() {
printf("before b, I am func a");
b();
printf("finish b, I am func a\n"); //不会打印这句话
}
int main() {
int ret; //存储返回值,第一次setjmp的返回值为0,后面的返回值是longjmp的参数值
ret = setjmp(envbuf); //将目前的状态存到envbuf中
if (ret == 0) {
a();
}
return 0;
}
//将jmp_buf envbuf定义为局部变量的实现方式
#include <stdio.h>
#include <setjmp.h>
void b(jmp_buf envbuf) {
printf("I am func b\n");
longjmp(envbuf, 2);
}
void a(jmp_buf envbuf) {
printf("before b, I am func a");
b();
printf("finish b, I am func a\n");
}
int main() {
jmp_buf envbuf;
int ret;
ret = setjmp(envbuf);
if (ret == 0) {
a(envbuf);
}
return 0;
}
C语言malloc指针转化和动态开辟二维数组(day_8)
最新推荐文章于 2024-07-01 16:34:08 发布