您的位置:首页 > 其它

【C Prime Plus】学习笔记,Chapter 10,数组和指针之四

2012-01-08 12:47 405 查看
// 指针操作:使用指针作为参数 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保证了 指针(数组的)越界一个地址 有效,但是那个地址的值不保证哦,这点 你就得记住了.)

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: