数组定义
// 定义数组
// int [] arr = {1,2,3,4}; 错误的写法
int arr[] = {1,2,3,4};
// 遍历数组
// 其他平台不能用 Clion能用, Linux上报错
/*for (int i = 0; i < 4; ++i) {
}*/
// VS非常严格,规范, CLion包容
// Linux上没有问题,Clion没有问题,Mac没有问题
int i = 0;
for (i = 0; i < 4; ++i) {
printf("%d\n", arr[i]); // 取值
}
数组的指针、内存地址、取值
// 数组 和 指针 挂钩
// 数组的内存地址 == 第一个元素的内存地址 == &arr
// 数组的内存地址 == 第一个元素,不是第二个元素,也不是第n个元素
printf("arr = %d\n", arr);
printf("&arr = %d\n", &arr);
printf("&arr[0] = %d\n", &arr[0]);
// 既然数组就是一个内存地址
int * arr_p = arr;
printf("%d\n", *arr_p); // *arr_p 取出元素一内存地址的值 1
arr_p ++; // 指针挪动 元素二的内存地址了
printf("%d\n", *arr_p); // *arr_p 取出元素二内存地址的值 2
arr_p += 2;
printf("%d\n", *arr_p); // 输出4
// 输出1
arr_p -= 3; // 挪动指针指向到 元素一
printf("%d\n", *arr_p);
arr_p += 2000;
printf("%d\n", *arr_p); // 系统值 572662306
// 数组是连续的内存空间(没有断层,有规律) 数组 每次挪动 4个字节 == int数组 (挪动数组元素类型对应的字节数)
数组大小
sizeof arr == sizeof(arr)
函数指针
void add(int num1, int num2); // 先声明
void mins(int num1, int num2) {
printf("num1 - num2 = %d\n", (num1 - num2));
}
// 操作 回调到 add mins
// void(*method)(int,int) 声明好 函数指针
// void 返回值
// (*method) 函数名
// (int,int) 两个参数
void opreate(void(*method)(int,int), int num1, int num2) {
method(num1, num2);
printf("opreate函数的 method指针是多少:%p\n", method);
}
// 7.函数指针。(回调) Java接口的回调
int mainT8() { // 【第一种写法】
opreate(add, 10, 10);
opreate(mins, 100, 10);
// 原理是什么?
printf("main函数的 add指针是多少:%p\n", add);
printf("main函数的 mins指针是多少:%p\n", mins);
// &add和add是一样的值吗
printf("%p, %p\n", add, &add); // 004018CE, 004018CE 一样的
return 0;
}
// 再实现 使用
void add(int num1, int num2) {
printf("num1 + num2 = %d\n", (num1 + num2));
}
函数指针2
void callBackMethod(char * fileName, int current, int total) {
printf("%s图片压缩的进度是:%d/%d\n", fileName, current, total);
}
// 压缩的方法
// 定义函数指针: 返回值(*名称)(int,double)
void compress(char * fileName, void(*callBackP)(char *,int,int)) {
callBackP(fileName, 5, 100); // 回调给外交 压缩的进度情况
}
// 函数指针2
int main9() {
// 1 如果有问题
// VS Clion 通过了, Linux 可能不通过(因为这样不合规范)
// void (* call) (char *, int ,int) = callBackMethod;
// 有种temp的思路一样的感觉
// 2 再换成这种方式 【第二种写法】
// Linux 先定义, 再赋值
void (* call) (char *, int ,int);
call = &callBackMethod;
void (* call2) (char *, int ,int);
void (* call3) (char *, int ,int);
void (* call4) (char *, int ,int);
void (* call5) (char *, int ,int);
call5 = &callBackMethod; // &callBackMethod 1000H == callBackMethod 1000H
compress("derry.png", call5);
// 常量指针 指针常量 【函数指针】
// 字符串 操作符重载 + C函数
// char * c = "Derry" + "A";
}
函数指针3
void add(int i,int j) {
printf("i+j=%d\n", i+j);
}
void add2(int i,int j) {
printf("2 i+j=%d\n", i+j);
}
// 函数 函数指针声明来接收函数
void test(void(*p)(int, int)) {
p(9, 9); // 省略*
(*p)(9, 9);
(p)(9, 9); // 省略*
// (&p)(9, 9); 在源码没有看到这种写法
// 思考:p 为什么也可以不用写 * 函数的上面已经声明就是 函数指针,所以可以省略*
}
int mainT1() {
test(add);
test(add2);
return 0;
}
网友评论