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

 
// 指针操作:使用指针作为参数 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)