我一直在想指针,无法找到解释它们的来源。
例如。给定一个数组int [3] 指针指向4个位置? 它以* [a + 0]开头并指向a的地址? 然后它接下来做什么? Int至少有16个字符,因此它需要读取2个字节,但每个字节都有一个地址。
这是否意味着对于[0]指针指向起始地址,那么程序从给定地址开始读取sizeof(int)字节?
接下来会做什么?它会停止阅读,给出结果和 对于a [1],它会指向& a + 1 * sizeof(int)的地址。 它将开始读取(& a + 2的地址(因为2代表已经读取的2个字节的地址)),开始读取,所以它会读取另外2个字节并打开和打开?
我不太明白这些概念。
PS:字符串由unsigned char组成,它是1个字节的元素。 你提到的帖子没有解释大于1字节的元素会发生什么。它也没有准确解释程序在“这是程序从内存中读取的字符串”旁边所做的事情。我认为我是对的,但你提到的标题远非我所提出的。 (因为有人写过这个,一个地址代表一个字节)
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|----|----|----|----|----|----| | | | | | | | | | |
0----+----01---+----12---+----2----+----+----+----+----+----+----+----+----+----+
我特意询问是否 int a [2]意味着指针首先: 在存储器地址(54)处的点,程序从2个以下地址读取数据(54到54,因为int占用2个字节),然后指针指向地址54 + 2,程序开始从地址范围&lt; 56,57&gt;读取。 。然后,指针指向58的起始范围,程序读取地址<&lt; 58,59&gt;
这个逻辑是否正确?它不是以NULL结尾的字符串。 我对字符串的猜测是,程序将按字节的地址访问内存字节的地址,并读取值,直到找到NULL。
数组不是字符串。
答案 0 :(得分:1)
考虑
int a[3] = {};
int b[300] = {};
这两个阵列是相似的&#34;因为它们包含int
的值,并且在这两个主要问题上有所不同:
int
值的内存。然而,这是最小分配的内存(在这种情况下 - 在堆栈上,因此很可能它也是为其分配的精确内存量)您可以轻松获取任一数组的第一个元素的地址:
int * p = a;
p = &a[0]; // same as above
p = b; // now p points to the first element of the second array
执行索引操作时编译器的作用是:它获取第一个元素的地址并将其增加一个等于 index 次的值每个元素的大小(当然,如果由于对齐而没有填充)。本质上,编译器正在这样做:
b[1] = 1;
*(p+1) = 1; // same as above
uint8_t * c = reinterpret_cast<uint8_t*>(p); // WARNING! Explanation follows
最后一行将导致编译器以不同方式重新解释指针,并且&#34;相同的&#34;地址算术&#34;突然&#34;工作方式不同:
c[1] = 1; // this is NOT the same as b[1] = 1
在这种情况下,编译器只会&#34;移动&#34;指针为8位(不是16位或32位,具体取决于您的平台&#39; s sizeof(int)
),最后是在数组的第一个int
元素的中间 b
。当然可以是有用的(特别是在直接与硬件打交道时),但是超级便携式非便携式,你应该始终避免这样做!
这当然不是一个全面的答案,但我并不打算提供一个,因为主题非常广泛,网上有大量资源可以为您提供有关此主题的更多详细信息