Tag: 指针

为什么这段代码在64位架构上进行段错误,但在32位上工作正常?

我遇到了以下的C拼图: 问:为什么下列程序在IA-64上进行段错误,但在IA-32上正常工作? int main() { int* p; p = (int*)malloc(sizeof(int)); *p = 10; return 0; } 我知道64位机器上int的大小可能与指针的大小不一样( int可能是32位,指针可能是64位)。 但是我不确定这与上面的程序有什么关系。 有任何想法吗?

我应该在C中使用char ** argv或char * argv 吗?

我只是在学习C,并想知道在我的主要方法中应该使用哪一个。 有什么区别吗? 编辑:那么哪一个更常用?

C中的指针:何时使用&符号和星号?

我刚刚开始用指针,我有点困惑。 我知道&意味着一个variables的地址,这个*可以在一个指针variables的前面被用来获得指针指向的对象的值。 但是当你使用数组,string或者当你用一个variables的指针副本调用函数时,事情会有不同的工作。 在这个内部很难看到一种逻辑模式。 我应该什么时候使用&和* ?

为什么我不能在C中将'char **'转换为'const char * const *'?

下面的代码片段(正确)给出了C中的警告和C ++中的错误(分别使用gcc&g ++,在版本3.4.5和4.2.1中testing; MSVC似乎不在乎): char **a; const char** b = a; 我可以理解并接受这一点。 这个问题的C ++解决scheme是将b改为const char * const *,它不允许重新分配指针,并且阻止你规避const正确性( C ++ FAQ )。 char **a; const char* const* b = a; 但是,在纯C中,修正后的版本(使用const char * const *)仍然会给出警告,我不明白为什么。 有没有办法解决这个问题,而不使用一个演员? 澄清: 1)为什么这会在C中产生警告? 它应该完全是常量安全的,C ++编译器似乎也是这样认识的。 2)接受这个char **作为参数的正确方法是什么?在说(并且让编译器强制执行)的时候我不会修改它指向的字符? 例如,如果我想写一个函数: void f(const char* const* in) { // Only reads the data from […]

数组是指针?

可能重复: 数组名是C中的一个指针吗? 数组和指针的实现是不同的? 我遇到过这个问题,因为在这两种情况下,我们都是从一个元素的起始地址访问元素的,所以它们之间应该有密切的关系。 请解释他们之间的确切关系。 谢谢。

如何使用指针expression式访问C中二维数组的元素?

我知道对于一维数组x=a[i]等价于x=*(a+i) ,但是如何使用指针访问二维数组的元素?

为什么地址零用于空指针?

在C(或C ++)中,如果指针的值为零,指针是特殊的:我build议在释放内存之后将指针设置为零,因为这意味着再次释放指针并不危险。 当我调用malloc的时候,如果它不能得到我的内存,它会返回一个零值的指针; 我一直使用if (p != 0)来确保传入的指针是有效的,等等。 但是由于内存寻址从0开始,不是0就像其他地址一样是有效地址吗? 如果是这种情况,怎么能用0来处理空指针呢? 为什么不是一个负数,而是null? 编辑: 一堆很好的答案。 我将总结一下自己心中所解释的答案,并希望如果我误解,社区会纠正我。 像编程中的其他所有东西一样,它是一个抽象。 只是一个常量,与地址0无关.C ++ 0x通过添加关键字nullptr强调这一点。 它甚至不是地址抽象,它是C标准指定的常量,编译器可以将其转换为其他数字,只要它确保它永远不等于“真实”地址,并且等于其他空指针(如果0不是为平台使用最好的价值。 如果它不是抽象的,那么早期就是这种情况,地址0被系统使用,并被程序员禁止。 我承认,我的负面数字build议是一个小狂野的头脑风暴。 对地址使用带符号的整数有点浪费,如果它意味着除了空指针(-1或任何)之外,值空间在正整数之间平均分配,使有效地址和负数被浪费。 如果任何数字总是可以用数据types来表示的话,那么它就是0(也可能是1),我认为一位整数是0或者1,如果是无符号的,或者只是有符号的位,如果是有符号的,会是[-2,1],但是你可以将0设为空,1是内存中唯一可访问的字节。 仍然有一些在我脑海中没有解决的问题。 堆栈溢出问题指向特定的固定地址的指针告诉我,即使0为空指针是一个抽象,其他指针值也不一定。 这导致我发布另一个堆栈溢出的问题, 我可曾想要访问地址零? 。

指针expression式:* ptr ++,* ++ ptr和++ * ptr

最近我遇到了自己无法理解的这个问题。 这三个expression式真的意味着什么? *ptr++ *++ptr ++*ptr 我试过里奇。 但不幸的是,他不能跟随他所说的这三项行动。 我知道,他们都执行增加指针/指向的值。 我也可以猜测评估的优先顺序和顺序可能有很多。 就像一个指针递增指针,然后获取该指针的内容,一个简单的提取内容,然后增加指针等等。正如你所看到的,我不清楚他们的实际操作,我想尽快明确。 但是当我有机会将它们应用于节目时,我真的迷失了方向。 例如: int main() { const char *p = "Hello"; while(*p++) printf("%c",*p); return 0; } 给我这个输出: ello 但我的期望是打印出Hello 。 最后一个请求 – 请给我举例说明每个expression式如何在给定的代码片段中工作。 大多数时候,只有一小段理论会飞过我的脑海。

Java有指针吗?

如果Java没有指针,那么new关键字在Java中做什么?

为什么函数指针和数据指针在C / C ++中不兼容?

我已经读过,将函数指针转换为数据指针,反之亦然,在大多数平台上工作,但不能保证工作。 这是为什么? 不应该都只是简单的地址到主内存,因此是兼容的?