对于C或C++中的许多新的,甚至是老的大学生来说,为什么指针会成为混乱的主要因素?是否有任何工具或思维过程可以帮助您理解指针在变量,函数和更高级别的工作方式?
有什么好的做法可以让人达到"啊哈,我明白了"的水平,而不会让他们陷入整体概念的困境?基本上,钻取方案.
最近,我看到这样的说法:
所有指针具有相同的大小是很常见的,但从技术上讲,指针类型具有不同的大小是可能的。
但后来我发现了这样的内容:
虽然指针的大小都是相同的,因为它们只存储内存地址,但我们必须知道它们指向什么类型的东西。
现在,我不确定以上哪种说法是正确的。第二个引用的语句看起来像是来自佛罗里达州立大学计算机科学的 C++ 笔记。
这就是为什么在我看来所有指针都应该具有相同的大小:
1)假设我们有:
int i = 0;
void* ptr = &i;
Run Code Online (Sandbox Code Playgroud)
现在,假设 C++ 标准允许指针具有不同的大小。进一步假设在某些任意机器/编译器上(因为标准允许),a 的void*大小为 2 字节,而 a 的int*大小为 4 字节。
现在,我认为这里有一个问题,即右侧有一个int*大小为 4 字节的 ,而左侧有一个void*大小为 2 字节的 。int*因此,当从到发生隐式转换时,void*将会丢失一些信息。
2)所有指针都保存地址。由于对于给定的机器,所有地址都具有相同的大小,因此所有指针也应该具有相同的大小是非常自然(合乎逻辑的)。
因此,我认为第二句话是正确的。
我的第一个问题是 C++ 标准对此有何规定?
我的第二个问题是,如果 C++ 标准确实允许指针具有不同的大小,那么有理由吗?我的意思是允许指针具有不同的大小对我来说似乎有点不自然(考虑到我上面解释的两点)。所以,我很确定标准委员会一定已经考虑到了这一点(指针可以有不同的大小),并且已经有理由允许指针有不同的大小。请注意,只有当标准确实允许指针具有不同的大小时,我才会问这个(第二个问题)。
c++ pointers void-pointers language-lawyer pointer-conversion
是char*,int*,long*甚至是long long*同样大小的(在给定的平台)?
指向c中浮点的指针大小是否可能与指向int的指针不同?尝试过之后,我得到了各种指针的相同结果.
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("sizeof(int*): %i\n", sizeof(int*));
printf("sizeof(float*): %i\n", sizeof(float*));
printf("sizeof(void*): %i\n", sizeof(void*));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里有哪些输出(OSX 10.6 64位)
sizeof(int*): 8
sizeof(float*): 8
sizeof(void*): 8
Run Code Online (Sandbox Code Playgroud)
我可以假设不同类型的指针具有相同的大小(当然在一个拱门上)?
在我的代码中:
char *str[] = {"forgs", "do", "not", "die"};
printf("%d %d", sizeof(str), sizeof(str[0]));
Run Code Online (Sandbox Code Playgroud)
我得到了输出12 2,所以我怀疑是:
str和str[0]是字符指针,对不对?它讨论了无法使用void *指针来保存函数指针,因为指向数据的指针和指向函数的指针在某些平台上可能具有不同的大小,并且void *只能保证足够大以保存指向数据的指针.
任何人都可以举一个平台的例子,其中指向数据的指针和指向函数的指针实际上有不同的大小?
void *是一个通用指针,但是呢void **?是void **也一个通用的指针?
我们可以强制转换void **到int **,char **等等.
我会感谢堆栈溢出系列的任何信息.
我听说指针首先应该转换为void以确保不同平台上的值的一致性,并且应该使用%p格式说明符.它为什么以及究竟是什么问题?
int x=100;
int *pi=&x;
printf("value of pi is: %p",(void*)pi);
Run Code Online (Sandbox Code Playgroud)