objective-c - objective-c 中的指针值

标签 objective-c ios pointers syntax

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

有关事实是

1)shaderSource定义为

NSString* shaderSource

2)glShaderSource的签名是
glShaderSource(GLuint shader, GLuint count, const GLchar** string, const GLint *length)

这有效:
int len = [shaderSource length];
const char *cstr = [shaderSource UTF8String];
glShaderSource(shader, 1, &cstr, &len);

这不起作用:
glShaderSource(shader, 1, &[shaderSource UTF8String], &[shaderSource length]);

我在这里显然不了解有关 objective-c 的某些信息,并且我想纠正该问题,因此,如果您如此愿意,请告诉我,WTF吗?

最佳答案

您似乎正在使用&[shaderSource UTF8String]为您提供额外的间接级别,以便类型正确,因为glShaderSource想要一个指向指针的指针。但是,您不能只是将&放在任何东西之前以获得指向它的指针。
&x的意思是“返回x的地址”;为了使之有意义,x必须是一个符号,而不是一个表达式。出于无法编写&[shaderSource UTF8String]的相同原因,您无法编写&(1 + t)。那只是一个表达式,您需要将值存储在某个地方,然后您才能传递地址(存储它的位置)。

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

关于objective-c - objective-c 中的指针值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11287314/

相关文章:

ios - 如何在不使用 segue 的情况下在 View Controller 之间传递数据

c++ - 有可能进行高效的基于指针的二进制堆实现吗?

如果我收到指针地址和指向指针的指针,我可以从函数修改指针值吗?

ios - 循环 ImageView 动画 iOS

ios - UI 不显示初始化程序的值

objective-c - Swift - 获取对具有相同名称但不同参数的函数的引用

c++ - 为指针 vector 取消引用迭代器时出现段错误

ios - 子类化静态库中的类

iphone - Apple 使用哪些 IP 地址来测试 iPhone 应用程序?

ios - 像 UIKit UIView 这样的 SwiftUI View ,如何更改图像的大小