Objective-C指针值
我正在使用X代码3.2.6(64位)编译一个应用程序。该应用程序是根据10.5 SDK和32位Intel体系结构编译的 我已将字符数组声明为:Objective-C指针值,objective-c,c,pointers,Objective C,C,Pointers,我正在使用X代码3.2.6(64位)编译一个应用程序。该应用程序是根据10.5 SDK和32位Intel体系结构编译的 我已将字符数组声明为: char iptmp[ARRAY_SIZE]; 因此,我调用一个函数,如下所示: myfunc(&iptmp); 在声明myfunc的地方: void myfunc(char** value) { ... }; 目的是使用strncpy将另一个字符串的内容加载到字符数组中。当您看到下面的内容时,您可能会理解为什么我不简单地执行以下操作:
char iptmp[ARRAY_SIZE];
因此,我调用一个函数,如下所示:
myfunc(&iptmp);
在声明myfunc的地方:
void myfunc(char** value)
{
...
};
目的是使用strncpy将另一个字符串的内容加载到字符数组中。当您看到下面的内容时,您可能会理解为什么我不简单地执行以下操作:strcpy(iptmp,myfunc());但问题是:
Value of iptmp prior to function call: 0xb0206f5a
Value of *value in function: 0xffffb020
我已经尝试了各种方法来解决这个问题,但唯一的方法似乎是接收UINT32值并进行强制转换:
myfunc((UINT32) &iptmp);
void myfunc(UINT32 value)
{
char* target = (char*) value;
...
}
这对我的代码造成了极大的破坏。指针值是怎么回事?为什么不
void myfunc(char *value)
{
strncpy(value, ...);
}
及
请记住,C中的数组和指针不是一回事,尽管您可能多次听到相反的说法。数组是一个对象,其大小等于其长度乘以其每个元素的大小,而指针就像一个int
,但具有特殊的语义
因此,两个表达式iptmp
和&iptmp
产生相同的结果,即数组的起始地址iptmp
为方便起见生成指针值,但这并不意味着对象iptmp
本身就是指针
通过尝试获取阵列地址的地址,您确实想要执行&(&iptmp)
,这是一个无意义的错误操作。为什么不
void myfunc(char *value)
{
strncpy(value, ...);
}
及
请记住,C中的数组和指针不是一回事,尽管您可能多次听到相反的说法。数组是一个对象,其大小等于其长度乘以其每个元素的大小,而指针就像一个int
,但具有特殊的语义
因此,两个表达式iptmp
和&iptmp
产生相同的结果,即数组的起始地址iptmp
为方便起见生成指针值,但这并不意味着对象iptmp
本身就是指针
通过尝试获取数组地址的地址,您确实想要执行
&(&iptmp)
,这是一个无意义的错误操作。这里发生的是iptmp
是内存中的一个位置。如果您编写iptmp
,您将获得aray的地址。但是,如果您编写&iptmp
,您也将获得它的地址。但是,假设您将获得指向数组指针的指针
处理此问题的最佳方法就是:
void myfunc(char * value)
{
...
};
指针
值将指向数组,您可以随意修改数组。这里发生的是iptmp
是内存中的一个位置。如果您编写iptmp
,您将获得aray的地址。但是,如果您编写&iptmp
,您也将获得它的地址。但是,假设您将获得指向数组指针的指针
处理此问题的最佳方法就是:
void myfunc(char * value)
{
...
};
指针值
将指向数组,您可以随意修改数组。当您解除限制*值
时,您说的是“使用存储在值
中的指针,并在该位置加载字节,就像它们是字符*
”。但是value
指向的位置处的字节不是char*
——它们是iptmp[]
本身的第一个字节(在您的例子中,是前4个字节)
根本原因是您正在将类型为char(*)[ARRAY\u SIZE]
的&iptmp
传递给需要char**
参数的函数。正如您所发现的,这些类型是不可互换的。函数的正确声明为:
void myfunc(char (*value)[ARRAY_SIZE])
{
/* ... */
}
然后,您可以传递&iptmp
,您将发现*value
具有您期望的值。当您解除限制*value
时,您说的是“使用存储在value
中的指针,并在该位置加载字节,就像它们是字符*
”。但是value
指向的位置处的字节不是char*
——它们是iptmp[]
本身的第一个字节(在您的例子中,是前4个字节)
根本原因是您正在将类型为char(*)[ARRAY\u SIZE]
的&iptmp
传递给需要char**
参数的函数。正如您所发现的,这些类型是不可互换的。函数的正确声明为:
void myfunc(char (*value)[ARRAY_SIZE])
{
/* ... */
}
然后你可以通过&iptmp
,你会发现*value
具有你所期望的价值。@Athabaska:OP在钱上iptmp
属于char*
类型,因此&iptmp
属于char**
。编辑:就这一点而言,无论如何…@Mac:那是不正确的iptmp
属于char[ARRAY\u SIZE]
类型,这与char*
完全不同(尽管前者在某些上下文中可用作后者),因此&iptmp
属于char(*)[ARRAY\u SIZE]
,这与char**
类型完全不同(并且永远不能互换)@caf:我可能有点匆忙。你说得对!:)@阿萨巴斯卡:行动是关于钱的iptmp
属于char*
类型,因此&iptmp
属于char**
。编辑:就这一点而言,无论如何…@Mac:那是不正确的iptmp
属于char[ARRAY\u SIZE]
类型,这与char*
完全不同(尽管前者在某些上下文中可用作后者),因此&iptmp
属于char(*)[ARRAY\u SIZE]
,这与char**
类型完全不同(并且永远不能互换)@caf:我可能有点匆忙。你说得对!:)谢谢靠得太近了