Android NDK基础3:C_指针与数组_函数指针

指针与数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//1.通过指针给数组赋值
void main() {
int uids[5];
//高级写法
//int i = 0;
//for (; i < 5; i++) {
// uids[i] = i;
//}
//早些版本的写法
int* p = uids;
printf("%#x\n", p);
int i = 0; //i是数组元素的值
for (; p < uids + 5; p++) {
*p = i;
i++;
}

getchar();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
//2.指针与数组的几种写法
void main() {
int a[] = { 78, 34, 73, 25, 80, 90 };
int i = 0;
for (; i < 6; i++) {
printf("%d, %#x", a[i], &a[i]);
//a首地址
//a 等价于&a[0],a+1 等价于&a[1]
//结论: a+i 等价于 &a[i]
//*a等价于 a[0],*(a+1)等价于a[1]
//结论: *(a+i)等价于a[i]
printf("%d, %#x", *(a+i), a+i);
printf("\n");
}
//总结:
//a+i 等价于 &a[i],*(a+i)等价于a[i],后者只是简写方式,在最古老的C语言里是没有中括号的

//另外一种写法
printf("\n\n");
int* p = a;
//p变量指针,a常量指针
//p = &i;
//a = &i; 不行
i = 0;
for (; i < 6; i++) {
//a[i]表达式:首地址[i]
printf("%d, %#x", p[i], &p[i]);
printf("%d, %#x", *(p+i), p+i);
printf("\n");
}

getchar();
}

//指针引用二维数组(行指针,列指针)
void main() {
int a[2][3] = {95,82,56,17,29,30};
//遍历输出
//外层循环控制行,内层循环控制列
int i = 0;
for (; i < 2; i++){
int j = 0;
for (; j < 3; j++){
printf("%d, %#x", a[i][j], &a[i][j]);
}
printf("\n");
}

//
//printf("%#x,%#x,%#x\n", a, &a, *a);
//printf("%d,%d,%d\n", sizeof(*a), sizeof(*&a), sizeof(**a));
//a是一个行指针,指向一个有三个元素的数组,12
//&a是一个指向二维数组的指针,当前二维 数组6个元素,24
//*a 是一个指向int类型数据的指针(a[0][0]),4
//printf("%d\n", **a);

//a是一个行指针,是数组第一行的指针,a+1第二行的指针,以此类推
printf("%#x,%#x\n", a, a+1);
//*a是数组的第一行第一个元素的指针,*a+1是数组第一行第二个元素的指针
printf("%#x,%#x\n", *a, *a+1);
//*(a+1)是数组的第二(1)行第一(0)个元素的指针
//注意:不一定是正常逻辑
printf("%#x,%#x\n", *(a+1), *(a+1)+1);

//取数组的第二(1)行,第三(2)个元素
printf("%d\n", a[1][2]);
printf("%d\n", *(*(a+1)+2));

//总结:
//a[i][j] 等价于 *(*(a+i)+j)
//&a[i][j] 等价于 (*(a+i)+j)

getchar();
}

函数指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

//3.函数指针
int msg(char* msg, char* title) {
MessageBox(0, msg, title, 0);
return 0;
}

void main() {
//msg();
//msg和&msg都是msg函数地址
printf("%#x\n", msg);
printf("%#x\n", &msg);
//函数指针
//函数返回值类型,函数指针的名称,函数的参数列表
int(*fun_p)(char* msg, char* title) = msg;
fun_p("消息内容", "标题");

getchar();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int add(int a, int b) {
return a + b;
}

int minus(int a, int b) {
return a - b;
}

//compute函数需要传递一个函数指针参数
//类似于我们Java中的回调函数
void compute(int(*func_p)(int a, int b), int m, int n) {
printf("执行一段代码...\n");
printf("执行回调函数...\n");
int r = func_p(m, n);
printf("执行结果:%d\n", r);
}

void main() {
//加法
//int(*func_p)(int a, int b) = add;
compute(add, 10, 20);
//减法
//compute(minus, 50, 10);
getchar();
}

综合案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <math.h>
#include <time.h>

//案例:用随机数生成一个数组,写一个函数查找最小的值,并返回最小数的地址,在主函数中打印出来
int* getMinPointer(int ids[], int len) {
int i = 0;
int* p = &ids[0];
for (; i < len; i++) {
if (ids[i] < *p) {
p = &ids[i];
}
}
return p;
}

void main() {
int ids[10];
int i = 0;
//初始化随机数发生器,设置种子,种子不一样,随机数才不一样
//当前时间作为种子 有符号 int -xx - > +xx
srand((unsigned) time(NULL));
for (; i < 10; i++) {
//100范围内
ids[i] = rand() % 100;
printf("%d\n", ids[i]);
}

int* p = getMinPointer(ids, sizeof(ids) / sizeof(int));
printf("%#x,%d\n", p, *p);
getchar();
}

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :