C Primer Plus Book的章节指针中有一个示例。
我对将数组名称设置为sump函数作为形式参数
的代码感到困惑Answer = sump(array, array + SIZE);
start是00EFFBD8
,这意味着arrary[0]
地址
但是当它动作时:
int *end = array +SIZE // => "array[0] address + 10"
为什么结尾是00EFFC00 (00EFFBD8 + 10*4)
,为什么不00EFFBD8 +10
???
#include <stdio.h>
#array size
#define SIZE 10
#sum function
int sump(int *start, int *end);
int main(void)
{
int array[SIZE] = { 10,9,8,7,6,5,4,3,2,1 };
long Answer;
Answer = sump(array, array + SIZE);
printf("a is %d\n", Answer);
return 0;
}
int sump(int *start, int *end)
{
int total=0;
while (start < end)
{
printf("start is %p, %d\n", start, *start);
printf("end is %p, %d\n", end, *end);
total += *start++;
}
return total;
}
答案 0 :(得分:0)
当某个地址(数组/指针)被添加到地址时,向地址添加一个意味着强制特定指针指向序列中下一个元素的起始字节而不是下一个字节。访问下一个字节是没有意义的,因为作为一个int的奇怪结果将以4个字节存储。
答案 1 :(得分:-1)
好吧,每个数据类型int float long
等等......当你声明它们时,每个数据类型占用内存中的一些空间。例如:
int k; //occupies 4-bytes of memory
float f; //occupies 4-bytes of memory
long l; //occupies 8-bytes
char c; //occupies 2-bytes
这是C公司为变量分配内存的惯例。现在,当你谈论地址。想象一下内存是块的形式,基地址/起始地址是100.所以当你声明一个int
类型变量时,它会把它放在100.但是,int
需要4字节的内存所以,CPU将赋予此变量的块&#39; k&#39;是,100,101,102和103(考虑到所有这些块的大小均为1字节)。所以现在为变量k分配块100到103。
当你声明一个int
类型的数组:int arr[10]
时,CPU会产生10个这样的k变量。这意味着:
arr[0] //this will have address from 100 to 103
arr[1] //will have address from 104 to 107
arr[2] //will have address from 108 to 111
依此类推,而基地址,即整个数组arr
的地址是100.所以你可以将arr[1]
的地址计算为base address of array + index*size of int
我们知道的地方数组的基地址是100,索引是我们需要计算的(即1)和int的大小,正如我前面所说的那样是4字节。所以,arr [1]的地址= 100 + 1 * 4 = 104。
类似地,结束地址,即arr [9],将是100 + 9 * 4 = 136,并且数组将以100 + 10 * 4结束。现在在您的问题中,值是十六进制,基址不是百。
C和C ++中的 EDIT char
遵循ASCII码,因此只占用1个字节的内存。我对Unicode之后的Java感到困惑,感谢@ David-Bowling让我意识到这个错误。