我restrict对此有一个大致的了解,但我希望澄清一些细节.我有一个函数从一个缓冲区读取一个以null结尾的字符串,并在另一个缓冲区中写出一个URL编码的版本.该函数具有此签名(当前没有restrict):
char const *StringUrlEncode(char const *unencoded,
char *encoded,
char *encodedEnd);
Run Code Online (Sandbox Code Playgroud)
unencoded是我的以null结尾的源字符串.目标缓冲区由encoded和表示encodedEnd,其中encoded指向char缓冲区encodedEnd中的第一个并指向缓冲区后的第一个字符,即函数将写入char但不包括指向的位置encodedEnd- 这是您的基本begin/ end迭代器如果您熟悉C++ STL约定,请配对.
如果我添加restrict到此函数,它应该只应用于前两个参数:
char const *StringUrlEncode(char const *restrict unencoded,
char *restrict encoded,
char *encodedEnd);
Run Code Online (Sandbox Code Playgroud)
或者通过将它添加到所有三个参数中我是否有一些好处?
我可以看到制作输入和输出缓冲区restrict有助于编译器知道它们不重叠.但是由于最后一个参数,encodedEnd仅用于标记输出缓冲区的结尾,我认为这restrict对编译器没有任何帮助(虽然我认为它不会受到伤害,除了添加不必要的噪声到函数声明).
我用指针已经有一段时间了,我想快速检查一下如何初始化一个整数指针?
a) int *tmpPtr = 0;
b) int *tmpPtr = null;
c) int a = 0;
int *tmpPtr = &a;
Run Code Online (Sandbox Code Playgroud)
编辑
到目前为止,感谢您的所有答案.有趣的是,如果我按如下方式对指针进行初始化,则mem :: copy操作正常.
int tmp = 0;
int *tmpPtr = &tmp;
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做:
int *tmpPtr = 0;
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));
Run Code Online (Sandbox Code Playgroud)
然后我在mem :: copy期间遇到崩溃...
奇怪的!
int main(){
Employee *e = new Employee();
delete e;
delete e;
...
delete e;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 为什么解除引用称为解除引用?
我只是正确地学习指针,我想知道为什么要解除引用.它使我感到困惑,因为它听起来像是要删除引用,而不是通过指向目标的指针.
任何人都可以解释为什么它被称为这个?
对我来说像destination或pointed_to_value这样的东西会更有意义.
考虑:
int* ptr = (int*)0xDEADBEEF;
cout << (void*)&*ptr;
Run Code Online (Sandbox Code Playgroud)
*如果它与一个立即使用&并且假设没有超载op&/ 在场,那么它是多么违法op*?
(这对解决过去的数组元素有一个特殊的影响&myArray[n],这个表达式明确相当于&*(myArray+n).这个Q&A解决了更广泛的情况,但我不觉得它真的满足了上面的问题.)
#include<stdio.h>
#include<stdlib.h>
int fun1()
{
printf("I am fun1.");
return 0;
}
int fun2(int fun())
{
fun();
return 0;
}
int main()
{
fun2(fun1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的程序可以运行.就我而言,我能理解int fun2(int (*fun)()),但我不知道它是如何int fun2(int fun())运作的.谢谢.
使用intptr_t作为通用存储(保存指针和整数值)而不是void*?(如下所示:http://www.crystalspace3d.org/docs/online/manual/Api1_005f0-64_002dBit-Portability-Changes.html)
对于我已经读过的内容:
int- > void*- > int往返不保证保持原值; 我猜int- > intptr_t- > int会的void*和intptr_t要求铸件,所以没有在这里得到好处void*表示存储指针时的显式转换次数较少,intptr_t表示存储整数值时转换次数较少intptr_t 需要C99我还应该考虑什么呢?
我刚刚开始潜入Go,我有一个主要的困惑点:我很难理解何时需要明确地取消引用指针.
例如,我知道.操作符将处理解除引用指针
ptr := new(SomeStruct)
ptr.Field = "foo" //Automatically dereferences
Run Code Online (Sandbox Code Playgroud)
在其他情况下,这样做?例如,似乎有数组.
ptr := new([5][5]int)
ptr[0][0] = 1
Run Code Online (Sandbox Code Playgroud)
我一直无法在规范中找到这个,指针部分非常短,甚至没有触及解除引用.任何关于解除引用指针的规则的澄清都会很棒!
通过阅读有关CI中指针和数组的一些细节,有点困惑.一方面,数组可以看作数据类型.另一方面,阵列往往是不可修改的左值.我想编译器会做一些事情,比如用常量地址替换数组的标识符,以及用于计算索引在运行时给出的位置的表达式.
myArray[3] -(compiler)-> AE8349F + 3 * sizeof(<type>)
Run Code Online (Sandbox Code Playgroud)
当说数组是数据类型时,这究竟意味着什么?我希望你能帮助我澄清我对数组实际是什么以及编译器如何处理它的困惑.
我在网上搜索,虽然我可以找到一些讨论,但我没有找到全面的描述.因此,如果任何人都可以形成一个涵盖指针大小的答案,那将会有很大的帮助.答案至少应包括以下主题
pointers ×10
c ×6
c++ ×6
32bit-64bit ×1
allocation ×1
arrays ×1
c99 ×1
dealloc ×1
dereference ×1
function ×1
go ×1
intptr ×1
memory ×1
terminology ×1