// 指针操作:使用指针作为参数 page 661 #include <stdio.h> #define SIZE 10 int sump(int *start,int *end); int main(void) { int marbles[SIZE]={20,10,5,39,4,16,19,26,31,20}; long answer; // 数组是int,求和防止出界,用long answer = sump(marbles,marbles+SIZE); // marbles 对应第一个元素的地址,然后移动10个单元(int),这他妈的都移到数组外面了. 心理不安呐,指针越界了,会不会出乱子? // marbles 作为首地址,移动9次(每次一个int,4字节的单元),恰好对应最后一个元素的地址,多好啊,非得搞出界,让人心理不安. printf("The total number of marbles is %ld.\n",answer); //--- return 0; } /* 使用指针作为参数*/ int sump(int *start,int *end) { // 干脆把地址输出来看看 printf("start pointer address(起始地址):%ld \n",start); printf(" end pointer address(终止地址):%ld \n",end); int total=0; while(start < end ) { total+= *start; start++; // start 移动到下一个int 单元(这是因为start形参定义为int类型),指向下一个地址. // 干脆把地址输出来看看,start 已经 加加了后的值 printf("start pointer address:%ld \n",start); } return total; }
输出结果:
start pointer address(起始地址):1245016
end pointer address(终止地址):1245056
start pointer address:1245020
start pointer address:1245024
start pointer address:1245028
start pointer address:1245032
start pointer address:1245036
start pointer address:1245040
start pointer address:1245044
start pointer address:1245048
start pointer address:1245052
start pointer address:1245056
The total number of marbles is 190.
//--------------------
/*
关于越界担忧的解释,该书是这样解释的:
C保证了当为一个数组分配空间的时候,指针指向数组结束后的第一个地址时,该指针是有效的指针
(再往后移一个地址就无效了哈)
原文:
C guarantees that when it allocates space for an array, a pointer to the first location
after the end of array is a valid pointer.
他说C这么搞呢,是为了保证代码的简洁优雅 (我看这就是他妈的有病,增加了程序的困恼和学习成本以及程序员间的沟通成本)
他说: answer = sump(marbles,marbles+SIZE) 这样简洁.
他说: answer = sump(marbles,marbles+SIZE-1) 这样外表不优雅,很难记,容易导致编程错误
(真他妈的恶心,C搞那么多额外的规定(保证) 不是更加难记么?)
最后他说:
By the way, although C guarantees that the pointer marbles+SIZE
is a valid pointer,it makes no guarantees about marbles[SIZE],
the value stored at that laction.
(这真够恶心的,他意思是说 C保证了 指针(数组的)越界一个地址 有效,但是那个地址的值不保证哦,这点 你就得记住了.)
*/