这是真的,Asterisk总是意味着"嘿,这是一个指针!" 指针总是有一个记忆地址?
(是的我知道a*用于数学运算的例外)
例如:
NSString* myString;
Run Code Online (Sandbox Code Playgroud)
要么
SomeClass* thatClass;
Run Code Online (Sandbox Code Playgroud)
要么
(*somePointerToAStruct).myStructComponent = 5;
Run Code Online (Sandbox Code Playgroud)
我觉得在定义一个指向类的指针的变量时,我需要了解更多关于Asterirsk(*)的信息.
因为有时我已经在参数声明中说过Parameter变量是一个指针,但我仍然需要在变量前面使用Asterisk来访问该值.最近发生在我希望以类似[myObj myMethod:&myStruct]的方式将结构的指针传递给方法之后,即使我的方法声明已经说过有参数,我也无法从该结构访问组件值( DemoStruct*)myVar确实应该被称为指向该demostruct的指针,我仍然总是说:"人,编译器.听!它IIISSS指针:"并写:(*myVar).myStructComponentX = 5;
我真的真的不明白为什么我要说两次.只有在这种情况下.
当我在NSString*myString的上下文中使用Asterisk时,我可以只访问myString但是我不喜欢每次都告诉编译器它是指针.即喜欢使用*myString = @"yep".
这对我来说毫无意义.
我遇到了一个情况,我有一个非常大的文件,我需要从中读取二进制数据.
因此,我意识到.NET中的默认BinaryReader实现非常慢.用.NET Reflector查看它后,我发现了这个:
public virtual int ReadInt32()
{
if (this.m_isMemoryStream)
{
MemoryStream stream = this.m_stream as MemoryStream;
return stream.InternalReadInt32();
}
this.FillBuffer(4);
return (((this.m_buffer[0] | (this.m_buffer[1] << 8)) | (this.m_buffer[2] << 0x10)) | (this.m_buffer[3] << 0x18));
}
Run Code Online (Sandbox Code Playgroud)
这让我觉得非常低效,想到自32位CPU发明以来计算机是如何设计用于32位值的.
所以我使用这样的代码创建了我自己的(不安全的)FastBinaryReader类:
public unsafe class FastBinaryReader :IDisposable
{
private static byte[] buffer = new byte[50];
//private Stream baseStream;
public Stream BaseStream { get; private set; }
public FastBinaryReader(Stream input)
{
BaseStream = input;
}
public int ReadInt32()
{
BaseStream.Read(buffer, 0, 4);
fixed …Run Code Online (Sandbox Code Playgroud) 有没有办法在C中对齐指针?假设我正在将数据写入数组堆栈(因此指针向下移动)并且我希望我写入的下一个数据是4对齐的,因此数据写入的内存位置是4的倍数,我该怎么做那?
我有
uint8_t ary[1024];
ary = ary+1024;
ary -= /* ... */
Run Code Online (Sandbox Code Playgroud)
现在假设ary在位置点0x05.我希望它指向0x04.现在我可以做到
ary -= (ary % 4);
Run Code Online (Sandbox Code Playgroud)
但是C不允许模数指针.有没有与架构无关的解决方案?
我知道有很多关于指针的问题,特别是现在的Objective-C.但我正在寻找一些更高级别的答案来帮助我理解Objective-C中的范例.
我听说有人说在Objective-C中使用指针是一个问题或经验,即有些类要求你使用指针,有些则不然.这是真的?这是在Objective-C中使用指针的程度.
基本上,除了想要将引用变量显式传递给方法之外,Objective-C中指针的规则是什么?
昨天我参加了一家知名欧洲公司的CTO的演讲,直到最近他才知道java有指针.在面对他时,他说他绝对肯定java中存在指针/不安全代码.
我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对编译器没有任何帮助(虽然我认为它不会受到伤害,除了添加不必要的噪声到函数声明).
#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 ×5
objective-c ×2
32bit-64bit ×1
alignment ×1
arrays ×1
binaryreader ×1
c# ×1
c++ ×1
c99 ×1
function ×1
go ×1
intptr ×1
java ×1
performance ×1
unsafe ×1