C语言malloc指针转化和动态开辟二维数组(day_8)

//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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值