【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保证了 指针(数组的)越界一个地址 有效,但是那个地址的值不保证哦,这点 你就得记住了.)
 */

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值