我正在阅读Kochan的书“C编程”。 在p。中的Pointer和Arrays部分。 264他说: 通常,索引数组的过程比访问指针内容的过程花费更多的时间来执行。 实际上,这是使用指针访问数组元素的主要原因之一 – 生成的代码通常更有效。 当然,如果对数组的访问通常不是顺序的,那么就这个问题而言,指针什么都不做,因为表达式*(指针+ j)和表达式数组[j]的执行时间一样长。 有人可以解释什么比什么更快? 具体来说,如果array [j]的速度= *(指针+ j)的速度那么索引数组 的过程是什么,以及访问指针内容的过程是什么? 此外,有关SO的问题和答案提到在编译期间将数组[j]转换为*(数组+ j),因此不应有任何区别。 总结:请给我一个Kochan所说的非常简单的例子。 2个代码并指向更快的代码,不必解释为什么它是真的。
我有这个function uint8_t Authorization_getRole (char const* userId, UsertoRole_T const *roleTable) 在主程序中我有: given_Role = Authorization_getRole (userId, roleTable) 我想用函数指针替换函数调用: uint8_t (*getRole_ptr)() given_Role = &getRole_ptr; 我的问题是: 我在哪里初始化函数指针getRole_ptr? 如何初始化函数指针? 下面的语法是否正确? getRole_ptr = Authorization_getRole (userId, roleTable)
假设 第一个案例 int a; int *p= &a ; it works no error 第二种情况 long int a; long int b; b = & a; it wont work 我们大多数人都说b是变量而不是指针。 但请看下面的内容。 所以问题是,如果&a返回一个无符号整数的地址,那么为什么我们不能将它分配给一个普通变量呢? 但为什么只能指针? 见下文 b = (unsigned int) &a ; it works after typecasting though its not practicable. 如果地址是整数格式,那么为什么无符号或长整数保存呢? 我在想,背后肯定有一些隐藏的秘密。 谁有人透露它? 我的想法是,指针必须在内部做一些事情,但我想知道它会是什么以及为什么普通变量不能。 感谢您的所有答案,但实际的问题是什么真的&a返回? 整数值与否? 如果是整数,为什么变量不能保持呢? long int a […]
当我调用一个需要指针的函数,并传入一个值时,我得到了这个警告,我喜欢这样。 但是当值恰好是字面值’0’时,我没有得到警告。 我认为这是因为C认为它是空指针,而不是值。 有没有办法仍然得到0字面的警告,因为我已经有一些错误因为它。
我如何JMP到C中的特定地址? 我想用 goto 0x10080000 这是行不通的,还有其他方法可以改变程序计数器的地址吗?
如果传入空指针,以下代码是否安全? if(ptr && *ptr == value) { //do something } 检查的顺序是否重要? 如果我改成它,它会起作用吗? if(*ptr == value && ptr) { //do something }
我有以下代码: char* get_address_string(PACKAGE* pkg){ char *c; sprintf(c, “%02x:%02x:%02x:%02x:%02x:%02x”, pkg->address[0], pkg->address[1], pkg->address[2], pkg->address[3], pkg->address[4], pkg->address[5]); return c; } 代码工作正常。 但是,我知道这不是在C中返回字符串的正确方法。我收到警告“c在此函数中使用未初始化”。 在C中编写此函数的正确方法是什么?
此代码似乎按预期工作,使用单个指针填充数字数组 #include #include #include int main(void) { int arr[4], count = 0, i; char *p, s[32] = ” \t 10, 15 \n ,20, 25 , “; p = s; do { arr[count++] = (int)strtol(p, &p, 10); while (isspace(*p) || *p == ‘,’) p++; } while (*p); for (i = 0; i < count; i++) { […]
我想知道*(&array + 1)实际上是如何工作的。 我认为这是一种计算数组长度的简单方法,并希望在使用之前正确理解它。 我对指针算法不太熟悉,但是我的理解&array给出了&array第一个元素的地址。 (&array + 1)将根据地址到达数组的末尾。 但不应该*(&array + 1)给出该地址的值。 而是打印出地址。 我非常感谢你的帮助,让我的脑袋里的指针清晰。 这是我正在研究的简单示例: int numbers[] = {5,8,9,3,4,6,1}; int length = *(&numbers + 1) – numbers;
typedef char* c; const c ptr1 = “pointer”; ++ptr1; /// error const char* ptr2 = “pointer”; ++ptr2; /// runs fine 现在ptr1应该是const char*类型,因此是非const指针,那么为什么它被视为常量指针?