C 几个程序,我们来聊聊数组,函数和指针
其实就是把书上的内容自己理解一番,做个连贯的笔记罢了。
1#include <stdio.h>
2#define SIZE 4
3
4int main(void)
5{
6 short dates[SIZE];
7 short * pti;
8 short index;
9 double bills[SIZE];
10 double * ptf;
11
12 pti = dates;
13 ptf = bills;
14 printf("%23s %10s\n", "short", "double");
15 for (index = 0; index < SIZE; index++)
16 printf("pointers + %d: %10p %10p\n", index, pti + index, ptf + index);
17 return 0;
18}
19
首先:
在C中,对一个指针加1的结果就是对该指针增加一个储存单元,对鼠族而言,地址会增加到下一个元素的地址,而不是下一个字节。
于是乎,我们可以看到他的地址被输出了:
1 short double
2pointers + 0: 0028FF0C 0028FEE8
3pointers + 1: 0028FF0E 0028FEF0
4pointers + 2: 0028FF10 0028FEF8
5pointers + 3: 0028FF12 0028FF00
6
关于为何不同,其实是因为short和double占的字节数是不一样的。(short使用两个字节,double则是八个)
* (dates + 2)
与*dates+2
并不同,因为*
的优先级高于+
,所以会优先运算,相当于对dates
当前指向的值加了2.
再来看看另一个:
1#include <stdio.h>
2#define MONTHS 12
3
4int main(void)
5{
6 int days[MONTHS] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
7 int index;
8
9 for (index = 0; index < MONTHS; index++)
10 printf("Month %2d has %d days.\n", index + 1, * (days + index));
11 return 0;
12}
13
可以看到* (days + index)
其实和days[index]
是一个效果的。
在函数中,我们可以这么传入数组int sum(int * ar)
,但是这样只能得到首元素的地址,却不知道数组个数(自然我们能把数组个数当成第二个参数传入),还可用int ar[]
代替,这是指向数组的指针,是一个指针(因为重要所以说两遍),为什么强调这一点,看这个程序就知道了:
1#include <stdio.h>
2#define SIZE 10
3
4int sum(int ar[], int n);
5
6int main(void)
7{
8 int marbles[SIZE] = {20, 10, 5, 39, 4, 16, 19, 26, 31, 20};
9 long answer;
10
11 answer = sum(marbles, SIZE);
12 printf("The total number of marbles is %ld.\n", answer);
13 printf("The size of marbles is %lu bytes.\n", sizeof marbles);
14
15 return 0;
16}
17
18
19int sum(int ar[], int n)
20{
21 int i;
22 int total = 0;
23
24 for (i = 0; i < n; i++)
25 total += ar[i];
26 printf("Te size of ar is %lu bytes.\n", sizeof ar);
27
28 return total;
29}
30
来看看输出:
Te size of ar is 4 bytes.
The total number of marbles is 190.
The size of marbles is 40 bytes.
调用函数的时候输出的是4,这是因为函数内,它并非是一个数组,只是一个int
类型的指针,int
类型为4个字节,而在main
中,数组本身由10个int
类型的数组成,所以是40。
请随时记得:* (days + index)
其实和days[index]
是一个效果的
除了指定数组大小外,还有什么办法指定:
1#include <stdio.h>
2#define SIZE 10
3
4int sump(int * start, int * end);\
5int main(void)
6{
7 int marbles[SIZE] = {20, 10, 5, 39, 4, 16, 19, 26, 31, 20};
8 long answer;
9
10 answer = sump(marbles, marbles + SIZE);
11 printf("The total number of marbles is %ld.\n", answer);
12 return 0;
13}
14
15int sump(int * start, int * end)
16{
17 int total = 0;
18
19 while (start < end)
20 {
21 total += *start;
22 start++;
23 }
24 return total;
25}
26
答案是一样的,因为索引从0开始,所以marbles + SIZE
指向数组结尾后下一个元素(再往后结果是未知的)。
评论 (0)