【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保证了 指针(数组的)越界一个地址 有效,但是那个地址的值不保证哦,这点 你就得记住了.)
*/
相关文章推荐
- 【C Prime Plus】学习笔记,Chapter 10,数组和指针之二
- 【C Prime Plus】学习笔记,Chapter 10,数组和指针之三
- 【C Prime Plus】学习笔记,Chapter 10,数组和指针之一
- 【C Prime Plus】学习笔记,Chapter 10,数组和指针之五
- 【C Prime Plus】学习笔记,Chapter 10,数组初始化问题
- 【C Prime Plus】学习笔记,Chapter 10,用const 修饰形参 保护数据,以防修改
- 【C Prime Plus】学习笔记,Chapter 12, 指针常量和常量指针
- C_PlusPlus学习笔记 - 5_数组、指针和字符串 (C++语言程序设计【第三版】 郑莉等,清华大学出版社)
- 【C Prime Plus】学习笔记,Chapter 3, 整型溢出 (integer overflow)
- 【C Prime Plus】学习笔记,Chapter 4, limits.h 和 float.h
- C++学习笔记(第六章 初识指针 及 指针与数组 之一)
- 【C语言学习笔记】数组、字符串、指针
- C语言学习笔记(17) 数组和指针分析
- 【C++】学习笔记十一——指针、数组和指针算术
- C/C++中关于地址、指针和引用变量的学习笔记(二) : 数组
- C语言学习笔记(6)-如何从变量声明的表面上来区分指针数组和数组指针
- 《Pro Git 2》学习笔记_Chapter 10_remote & packfiles&refspec
- 黑马程序员-IOS学习笔记 用指针逆序一个数组
- 黑马程序员---学习笔记10:结构体数组
- C Primer Plus学习 十九 指针和数组