目标C中的指针值

jjm*_*jjm 1 syntax pointers objective-c ios

我正在使用OpenGL着色器,它更喜欢C字符串到NSStrings,而且我遇到了以下奇怪的问题:

相关事实是这样的

1)shaderSource定义为

NSString* shaderSource
Run Code Online (Sandbox Code Playgroud)

2)glShaderSource的签名是

glShaderSource(GLuint shader, GLuint count, const GLchar** string, const GLint *length)
Run Code Online (Sandbox Code Playgroud)

这有效:

int len = [shaderSource length];
const char *cstr = [shaderSource UTF8String];
glShaderSource(shader, 1, &cstr, &len);
Run Code Online (Sandbox Code Playgroud)

这不起作用:

glShaderSource(shader, 1, &[shaderSource UTF8String], &[shaderSource length]);
Run Code Online (Sandbox Code Playgroud)

我在这里显然不了解客观方面的问题,我想纠正这个问题,所以如果你这么倾向,请祈祷告诉,WTF?

ben*_*ado 5

您似乎正在使用&[shaderSource UTF8String]为您提供额外的间接级别,因此类型将是正确的,因为glShaderSource需要指向指针的指针.但是你不能只是把&任何东西放在前面来获得它的指针.

&x表示"返回x的地址"; 为了理所当然,x必须是一个符号,而不是一个表达.你不能写你不能写&[shaderSource UTF8String]的相同理由&(1 + t).这只是一个表达式,您需要将值存储在某处,然后才能传递地址(存储它的位置).

如果您习惯使用C-structs,这可能会让您感到困惑,因为如果您有一个foo带成员的结构bar,您可以通过编写获取成员的地址&foo.bar.但Objective-C对象不是结构(从技术上讲,它们是不透明的结构).您通过发送消息从它们获取属性值,这与函数调用基本相同.因此,如果foo是一个对象并且bar是一个属性,&foo.bar(这实际上是简单的&[foo bar])是一个无效的表达式.