Tag: 数组

使用goto跳过变量声明?

我正在阅读C编程 – KNKing 的现代方法来学习C编程语言,并且注意到goto语句不能跳过变长数组声明。 但现在问题是:为什么goto跳转允许跳过​​固定长度数组声明和普通声明? 更确切地说,根据C99标准,这些例子的行为是什么? 当我测试这些案例时,似乎声明实际上没有被跳过,但这是正确的吗? 声明可能已跳过的变量是否可以安全使用? 1。 goto later; int a = 4; later: printf(“%d”, a); 2。 goto later; int a; later: a = 4; printf(“%d”, a); 3。 goto later; int a[4]; a[0] = 1; later: a[1] = 2; for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++) printf("%d\n", a[i]);

C,多维数组:元素是一维数组的数组?

这个陈述是否有意义,请参阅“ C编程:现代方法”,第269页第2版 正如一维数组的名称可以用作指针一样, 任何数组的名称也可以使用,无论它具有多少维度。 但是,需要注意一些事项。 考虑以下数组: int a[NUM_ROWS][NUM_COLS]; a 不是指向a[0][0];的指针a[0][0]; 相反,它是指向a[0]的指针。 如果我们从C的角度来看它会更有意义,它不是将二维数组视为二维数组,而是将元素视为一维数组的一维数组。 当用作指针时, a具有类型int (*) [NUM_COLS] (指向长度为NUM_COLS的整数数组的NUM_COLS )。 我很困惑,因为当我认为“其元素是一维数组的数组”时,我认为是一个锯齿状数组 ,但这不是这里发生的事情..这更像是一个带指针算术的宏? 这是参考类型系统以及它如何处理多维数组? 任何人都能解释一下吗?

在C中从数组创建子数组的最佳方法

我有一个数组说a[3]={1,2,5} 。 我必须创建另一个数组a2[2]={2,5} 。 我试过的是创建一个新的数组a2[]并只复制所需位置范围内的所有元素。 有没有其他方法可以在C?中完成此任务。

C语言数组中未初始化元素的值

我有一个包含3个元素的数组。 但我只想初始化其中的2个。 我让第三个元素空白。 unsigned char array[3] = {1,2,}; int main(){ printf(“%d”,array[2]); return 0; } 打印结果是0.我在IAR和一些在线编译器上测试过它。 第三个元素的值是否有任何C规则? 是否有任何编译器通过0xFF填充第三个元素? (特别是交叉编译器)

是“int * ptr = *((&a)+ 1);”其中“a”是由标准明确定义的int ?

基于这个问题( c中的奇怪输出问题 )有一个答案( 由@Lundin提供 )关于这一行: int *ptr = (int*)(&a+1); 在哪里他说: the cast (int*) was hiding this bug 。 所以我带来了以下内容: #include int main( void ){ int a[5] = {1,2,3,4,5}; int *ptr = *( ( &a ) + 1 ); printf(“%d”, *(ptr-1) ); } 我想知道这是否: int *ptr = *( ( &a ) + 1 ); 标准明确定义了吗? 编辑 […]

有效地存储三角矩阵

我需要通过不将所有零存储在内存中来有效地存储下三角矩阵,所以我已经考虑过这种方式:首先我为每一行分配内存,然后为每一行分配i + 1个字节,所以我永远不会不得不担心零,但在第一次分配时出现问题。 我究竟做错了什么? 这是我的代码,编译器在读取矩阵的维度后,在第8行退出程序。 #include #include int main () { int i, j, **mat1, dim; scanf(“%d”,&dim); *mat1 = (int**)calloc(dim, sizeof(int*)); for(i = 0; i<dim; i++) mat1[i] = (int*)calloc(i+1, sizeof(int)); for(i = 0; i < dim; i++) for(j = 0; j < i+1; j++) scanf("%d", &mat1[i][j]); for(i=0; i<dim; i++) for(j=0; j<(i+1); j++) printf("%d%c", mat1[i][j], j […]

有没有办法在C中使用带常量索引的常量数组作为开关案例标签?

我有一些常量值和数组定义它们的标签和哈希码。 例如, #define LABEL_A 0 //or const int LABEL_A = 0; #define LABEL_B 1 #define LABEL_C 2 #define LABEL_D 3 const char *VALUE[] = {“LABEL_A”, “LABEL_B”, “LABEL_C”, “LABEL_D”}; const int VALUE_HASH[] = {67490, 67491, 67493, 67459); 在运行时,这些标签可以按任何顺序排列,需要进行相应的解析。 我正在使用开关盒来达到这个目的。 此代码在编译时生成错误“需要常量表达式。 function(const char* LabelAtRuntime){ int i = getHashCode(LabelAtRuntime); switch(i){ case VALUE_HASH[LABEL_A]: //line giving compile time error break; […]

arrays初始化的时间复杂度是多少?

考虑以下两种C或C ++中的数组初始化情况: 情况1: int array[10000] = {0}; // All values = 0 案例2: int array[10000]; for (int i = 0; i < 10000; i++) { array[i] = 0; } 他们俩都花时间吗? 案例1的复杂性是什么? 哪个更好?

在C中,数组初始化只有一个元素专门处理?

在阅读这个问题时,我想测试GCC中的输入,看看会输出什么错误。 令我惊讶的是以下一行: char array[] = {“s”}; 编译时没有错误或警告,导致大小为2的数组包含”s\0″ 。 我原本期望编译器错误,因为表达式的右侧是char*[]类型。 在这种情况下,数组初始化只有一个元素不被视为数组,为什么?

为什么我的数组索引比指针快

为什么数组索引比指针快? 指针不应该比数组索引快吗? **我使用time.h clock_t来测试两个函数,每个函数循环200万次。 Pointer time : 0.018995 Index time : 0.017864 void myPointer(int a[], int size) { int *p; for(p = a; p < &a[size]; p++) { *p = 0; } } void myIndex(int a[], int size) { int i; for(i = 0; i < size; i++) { a[i] = 0; } }