我正在研究一些C++,我正在用指针进行斗争.我明白通过声明我可以有3个级别的指针:
int *(*x)[5];
Run Code Online (Sandbox Code Playgroud)
所以这*x是一个指向5个指向的元素数组的指针int.我也知道x[0] = *(x+0);,x[1] = *(x+1)等等....
那么,鉴于上述声明,为什么x[0] != x[0][0] != x[0][0][0]呢?
我找到了一个计算数字平方的函数:
int p(int n) {
int a[n]; //works on C99 and above
return (&a)[n] - a;
}
Run Code Online (Sandbox Code Playgroud)
它返回n 2的值.问题是,它是如何做到的?经过一点点测试后,我发现之间是(&a)[k]和/ .这是为什么?(&a)[k+1]sizeof(a)sizeof(int)
我想知道它们之间的区别
const int* ptr;
Run Code Online (Sandbox Code Playgroud)
和
int * const ptr;
Run Code Online (Sandbox Code Playgroud)
以及它是如何工作的.
我很难理解或记住这一点.请帮忙.
编程语言(如C,C++)中语法和语义的区别是什么?
是的,这是一个家庭作业问题,但我已经完成了我的研究并对这个主题进行了相当深入的思考,并且无法弄清楚这一点.问题是这段代码没有表现出短路行为,并询问原因.但它在我看来它确实表现出短路行为,所以有人可以解释为什么它没有?
在C:
int sc_and(int a, int b) {
return a ? b : 0;
}
Run Code Online (Sandbox Code Playgroud)
在我看来,如果这a是假的,程序根本不会尝试评估b,但我一定是错的.为什么程序b在这种情况下甚至不需要触摸?
在尝试实现C11解析器(用于教育目的)时,我发现在C11(p.470)中也在C99(p.412)中(感谢Johannes!),直接声明符定义为:
(6.7.6) direct-declarator:
direct-declarator [ type-qualifier-list? * ]
Run Code Online (Sandbox Code Playgroud)
起初,我认为这是语法中的错误(类型列表不应该是可选的).但是,当我在我的参考编译器(clang)中尝试这个时,我得到了一个意外的错误:
int array[*] = { 1, 2, 3 };
// error: star modifier used outside of function prototype
Run Code Online (Sandbox Code Playgroud)
显然,(在clang中)这被称为星形修饰符.
我很快就知道它们只能在函数签名中使用:
void foobar(int array[*])
Run Code Online (Sandbox Code Playgroud)
但是,它们只能用于声明中.尝试在函数定义中使用它也会导致错误:
void foobar(int array[*]) {
// variable length array must be bound in function definition
}
Run Code Online (Sandbox Code Playgroud)
所以据我所知,预期的行为是[*]在函数声明中使用,然后在函数定义中使用固定数字.
// public header
void foobar(int array[*]);
// private implementation
void foobar(int array[5]) {
}
Run Code Online (Sandbox Code Playgroud)
但是,我从未见过它,我也不太了解它的目的.
int[]?int * …该联机帮助页说memset:
Run Code Online (Sandbox Code Playgroud)#include <string.h> void *memset(void *s, int c, size_t n)的
memset()功能填充第一n字节的存储器区域的指向s与恒定字节c.
很明显,memset不能用于初始化int数组,如下所示:
int a[10];
memset(a, 1, sizeof(a));
Run Code Online (Sandbox Code Playgroud)
它是因为int由4个字节(比如说)表示,并且一个不能得到数组中整数的所需值a.
但我经常看到程序员 memset用来将int数组元素设置为0或者-1.
int a[10];
int b[10];
memset(a, 0, sizeof(a));
memset(b, -1, sizeof(b));
Run Code Online (Sandbox Code Playgroud)
根据我的理解,使用整数初始化0是可以的,因为0可以用1个字节表示(在这种情况下可能是我错了).但是,如何可以初始化b与-1(一个4个字节的值)?
这个C99代码是否会产生未定义的行为?
#include <stdio.h>
int main() {
int a[3] = {0, 0, 0};
a[a[0]] = 1;
printf("a[0] = %d\n", a[0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在声明中a[a[0]] = 1;,a[0]都是读取和修改.
我看了ISO/IEC 9899的n1124草案.它说(在6.5表达式中):
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,先前的值应该只读以确定要存储的值.
它没有提到读取对象来确定要修改的对象本身.因此,此语句可能会产生未定义的行为.
但是,我觉得很奇怪.这实际上是否会产生未定义的行为?
(我也想知道其他ISO C版本中的这个问题.)
我正在做一些C编码,在阅读了一些C代码后,我注意到有类似的代码片段
char *foo = (char *)malloc(sizeof(char) * someDynamicAmount);
Run Code Online (Sandbox Code Playgroud)
所以我想问一下C-ish为char数组分配内存的方法是什么?sizeof(char)对任何标准更改使用并假设未来的代码更改或省略它并直接使用数字?
在以下代码中:
final int a;
a=2;
byte b=a; // error: possible loss of precision
Run Code Online (Sandbox Code Playgroud)
为什么我会收到此错误?是不是a最终变量编译时常量表达式,因此在赋值期间隐式缩小为字节?
换句话说,上面的代码不等同于:
final int a=2;
byte b=a;
Run Code Online (Sandbox Code Playgroud)