Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C指针值_Objective C_C_Pointers - Fatal编程技术网

Objective-C指针值

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将另一个字符串的内容加载到字符数组中。当您看到下面的内容时,您可能会理解为什么我不简单地执行以下操作:

我正在使用X代码3.2.6(64位)编译一个应用程序。该应用程序是根据10.5 SDK和32位Intel体系结构编译的

我已将字符数组声明为:

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:我可能有点匆忙。你说得对!:)谢谢靠得太近了