我读这个帖子这是关系到char和byte,并遇到了下面的话:
一个
int*仍然可以被实现为单个硬件指针,因为C++允许sizeof(char*) != sizeof(int*).
如何理解'C++允许sizeof(char*) != sizeof(int*)'?
对于每个p1类的指针,class1我们应该考虑使用前向声明class1而不是包含class1头文件来考虑任何风险吗?
我只能看到优势:头文件的大小会更小.
我想传递一个指向函数的"多态"数组.
我可以在没有警告的情况下做以下事情:
foo (void* ptr);
bar()
{
int* x;
...
foo(x);
}
Run Code Online (Sandbox Code Playgroud)
gcc显然会自动转换x为a (void*),这只是花花公子.
但是,当我执行以下操作时,我会收到警告:
foo (void** ptr);
bar()
{
int** x; // an array of pointers to int arrays
...
foo(x);
}
note: expected ‘void **’ but argument is of type ‘int **’
warning: passing argument 1 of ‘foo’ from incompatible pointer type [enabled by default]
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么一个传递(int*)的(void*)参数不是"不兼容",但(int**)作为一个(void**)论据是什么?
由于所有指针类型都是相同的大小(对吗?因为我使用了C已经有一段时间了),我仍然可以做类似的事情:
void mainFunc1(int** arr, int len)
{
//goal is to apply …Run Code Online (Sandbox Code Playgroud) 通过C教程学习
#include <stdio.h>
int main() {
short s = 10;
int i = *(int *)&s; // wonder about this
printf("%i", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我告诉C该地址s是一个int时,它是否应该读取4个字节?
从2字节的最左侧开始s.在这种情况下,这不是非常危险的,因为我不知道它在读什么,因为短路只分配了2个字节?
如果尝试访问我没有分配/属于我的内存,这不应该崩溃吗?
好吧,对不起,这个问题更像是一个一般的文化(还没有找到确切的答案)。
如果我有类似的东西
char * Field
Run Code Online (Sandbox Code Playgroud)
或者
void * Field
Run Code Online (Sandbox Code Playgroud)
或者
double pointers
Run Code Online (Sandbox Code Playgroud)
假设 C 中的示例(我倾向于相信其他不直接处理指针的语言也是如此)
#include<iostream>
using namespace std;
struct a{
int e;
struct abc *d;
};
struct abc{
int c;
};
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我已经定义了我已经声明了结构指针的struct abc后定义.这应该抛出编译错误,因为它在声明之前使用.但是,它没有,为什么?而当我刚刚取代它,而不是,这是给编译错误预期.struct aabcabcstruct abc dstruct abc *d
我正在读一本关于" 理解和使用c指针 "的指针的书
说到void *它说
它有两个有趣的属性:
- 指向void的指针将具有与指向char的指针相同的表示和内存对齐.
令人困惑的是,所有指针的记忆都不一样吗?他们为什么而不是写void*与它明确提到的char指针的普通指针相同?真的很感激任何帮助
我知道一个函数的指针是8字节,因为虚拟化,但为什么指向函数指针的指针是8字节?
typedef void(*fun())();
sizeof(fun*); // returns 8 byte
Run Code Online (Sandbox Code Playgroud)