c - 对于( *ptr ) [],为什么要使用 printf ("%p",( void* ) ptr+1,而不是 printf ("%p",ptr+1 )?

  显示原文与译文双语对照的内容
0 0

这个问题已经有了如下答案:

如果你不在我之前的版本,那么我就会把它打印出来,因为我在转换为类型 void* 时遇到了一个错误,它显示了一个错误。

这个程序是如何计算 ptr+1的,因为它只是不知道它的界限。 如果是提前移动 5个元素,或者提前 8个元素,或者前面的元素是什么为什么 (void*)ptr+1 没有显示与 ptr+1 相同的错误?

为了更好地突出显示整个事件,我还使用了一个指针 ctr,显式声明为 (*)[5] 类型,而不是 (*)[] 。 请告诉我 this.Thank 背后的技术原因。

#include<stdio.h>
int main(void)
{
 int ar1[5]={1,5,3,8,9};
 int (*ptr)[]=&ar1,(*ctr)[5]=&ar1;
 printf("%pn",ptr+1);//ERROR about unspecified bounds
 printf("%pn",(void*)ptr+1);//It's ok
 printf("%pn",ctr+1);//It's ok
}

注意最后两个正确的printf() 不要产生错误的printf("%pn",ptr+1); 行,这就是输出。

0023FF25

0023FF38

我再次检查了 PSSTptr+1 部分,一个只是被添加到 ptr的数值中。发生了什么?!

时间:原作者:4个回答

0 0

请告诉我背后的技术原因。

技术原因是当添加一个时,编译器试图跳转到该类型的下一个实例。

例如:向一个 int 指针添加一个指针将增加 4 字节,因为是 4字节,然后将指向下一个int指针。

在你的示例中,你从未指定过。 由于这里元素的大小未知,所以无法跳转到下一个元素。 一旦指定了大小,使它的指向精确的5个元素的array,它再次工作。

当将ptr转换为void时,再次进入下一个元素变得很容易。 编译器只添加了一个字节。

在你的运行中:

ptr0023FF24

((void*)ptr) + 10023FF25 ( 一个元素的基地址加 1字节"void"

ctr0023FF24 ( 与ptr相同)

ctr + 1int (*)[5]的一个元素的0023FF38 ( 基址,加上 20 ( 5 * sizeof(int) ) ) 字节

原作者:
0 0

根据你的代码

int (*ptr)[]

ptr是指向未知 array的指针直到现在编译器不知道你试图创建一个increament的大小,编译器仍然没有任何想法。 指针increament将是你正在获取的sizeof ( 指向元素). so的添加,错误"未绑定绑定"。

现在为了你的剩余两个问题,为了更好地了解 one-"为什么( void* ) 中的两个问题,你的答案如( char* ) 。

在( N1256草稿) 标准:6.2.5-27中:

A pointer to void shall have the same representation and alignment requirements as a pointer to a character type.

原作者:
0 0

你在这里做了什么奇怪的声明。 也许你是在尝试这样做:

int *ptr=ar1;

在创建一个 array 时,要记住,实际上,定义指向第一个 array 元素的指针,然后保留足够的内存来包含整个 array 元素。 那么

int ar1[5] = {1,5,3,8,9};

在内存空间保留 5个整数,将它们初始化为给定的值集,并将ar1定义为指向第一个元素的指针。

在索引 array 时,你将对 array 指针应用一个偏移。 你将访问指针+ ( size_of ( 元素) *index ) 内存位置。

如果在变量声明中使用 [],则与使用 *, 相同,因此

int *myvar[];

是否与

int **myvar;

所以当你宣布这个

int (*ptr)[]=&ar1

实际上是定义指针指针并用指向 array的指针的地址初始化它。 非常奇怪,所以回到我最初的建议,你正在寻找的也许是

int *ptr=ar1;
原作者:
...