数组 指针求和问题

mengjiacun 2013-01-21 09:50:46
#include <stdio.h>
#define SIZE 10
int sum(int ar[], int n);
int main(void)
{
int marbles[SIZE] = {20,10,5,39,4,16,19,26,31,20};
long answer;

answer = sum(marbles, SIZE);
printf("The total number of marbles is %ld.\n", answer);
printf("The size of marbles is %zd bytes.\n",
sizeof marbles);

return 0;
}

int sum(int ar[], int n) // how big an array?
{
int i;
int total = 0;

for( i = 0; i < n; i++)
total += ar[i]; printf("The size of ar is %zd bytes.\n", sizeof ar);

return total;
}
ar[i]怎么理解啊?实在是不解,这不是指针么?还可以用数组的形式表示?
...全文
359 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wszzfzsc 2013-01-22
  • 打赏
  • 举报
回复
请仔细看书区别什么是指针和数组
a19895161989516 2013-01-21
  • 打赏
  • 举报
回复
编译器首先在编译如下代码时:

int sum(int ar[], int n);
//会编译成:
int sum(int *ar, int n);
指针变量ar保存的是数组首元素的指针(地址),在访问首元素的值的时候可以使用*ar(表达式); 如:

int n=*ar;
其中*为间接访问运算符,其意在于访问ar指向(保存的变量的地址)的变量中的值
在操作数值指针的时候可以使用ar+i的方式访问数据的第i个元素的地址(因为ar指向第一个元素的地址), 如果要取出第i个元素的值,可以使用间接访问运算符*,表达式为: *(ar+i) 为了便于指针操作,在c语言中提供了另外一种另外运算符[],为下标运算符; 如ar[i]就可以直接取出指针指向变量的值,这里是一种直接的表达(其实内部还是使用了ar+i的方式取出第i个元素的地址,然后使用*(ar+i)取出第i个元素的指); 等价伪代码如下

 //temp指向了第i个元素(保持了第i个元素的地址)
 int *temp=ar+i;

 //取出第i个元素的指赋给n
 int n=*temp;

 /*
  利用[]下标运算符可以将上述两行代码可以写成一行
  */
 int n=ar[i];
[]可以使用在任何指针变量中,只不过有时不一定有意义(非连续的存储结构); 希望你自己慢慢理会……
lin5161678 2013-01-21
  • 打赏
  • 举报
回复
楼主真该好好看看书 a[i] == *(a+i)
dengjingen 2013-01-21
  • 打赏
  • 举报
回复
数组的定义为int a[n];数组名a也代表数组的指针(等同于&a),也是数组第一个元素的指针,在参数中的表示形式是int a[];数组的元素用a[i]表示,第i个元素的指针为&a[i]. 指针数组定义为int *a[i];这样定义的话那么,a[i]表示指针。
彭家老三 2013-01-21
  • 打赏
  • 举报
回复
ar[]是数组,ar[i]是数组里的元素。ar是数组名,是数组的地址,也是数组第一个元素的地址。
lee_鹿游原 2013-01-21
  • 打赏
  • 举报
回复
楼主应该把书好好看一遍。 下标访问[]
Panda_熊猫 2013-01-21
  • 打赏
  • 举报
回复
ar[i] 不是指针,是 数组ar[] 的第i个元素的值。
赵4老师 2013-01-21
  • 打赏
  • 举报
回复
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单! 指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认: 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物; 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。 这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑! 这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!! 提醒: “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。 (Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 想要从本质上理解C指针,必须学习C和汇编的对应关系。” 不是一回事! 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码! 电脑内存只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、……
Ericz 2013-01-21
  • 打赏
  • 举报
回复
楼主初学这方面的语法,这个问题就是一个简单的语法问题, 如果任何一本C语言的书里都有描述,这里简单的说一下: C语言中数组a[i]的这对中括号"[]"请把它理解成一个"运算符" a[i] 相当于是 *(a + i), 所以代码中,你问的那一行程序 total += ar[i]; 相当于: total += *(ar + i); 为了加深对[]的理解,你不妨试试把那一行写成如下这样: total += i[a]; 这样也是正确的,因为i[a] = *(i + a); *(i + a) 和 *(a + i)是一回事。 多嘴一句,虽然有a[i] = *(a + i); 但是不要就此认为C语言中指针和数组是一回事,C语言中数组可以转换成指针, 但是他们之间还存在很多差别。
Joseph_ 2013-01-21
  • 打赏
  • 举报
回复
int sum(int ar[], int n) // how big an array? int sum(int *ar, int n) // how big an array? 其实在你这份代码里是等价的, 为了表示传入参数的是一个数组写为 int ar[] 这种形式。传入的是数组的首地址了肯定可以使用 ar[i]啊
兆帅 2013-01-21
  • 打赏
  • 举报
回复
是的 可以

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧