我目前正在学习struct
C中的数据结构,以及如何用typedef
关键字为这个结构做准备.这会导致实际结构的变量名称放在不同的名称空间中,如以下几个不同的引用中所述:
C++中'struct'和'typedef struct'之间的区别?
typedef struct vs struct definitions
但是,我不清楚我正在使用的示例中发生了什么:
#include <stdio.h>
struct demo
{
short low_pass_vcf;
short filter_coupler;
short reverb;
short sequential;
} synth;
int main()
{
printf("Size of struct: %i\n", sizeof(struct demo));
printf("Size of struct: %i\n", sizeof(synth));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我能够struct
通过synth
变量名访问数据结构; 然而,在我看到的例子中,为了让我能够做到这一点,struct
需要以此为前提typedef
.在这个例子中,typedef
没有使用,但我仍然能够引用这个结构synth
.我想知道C允许我这样做到底发生了什么?任何解释将不胜感激.干杯.
我正在学习C,并开始探索指针和指针算术的世界.例如,在以下代码段中:
int nums[] = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)
nums
是一个Array变量,其作用类似于指向数组第一个内存位置的指针.我写了下面的示例代码,并试图理解为什么我得到的结果是:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int nums[] = {1, 2, 3};
if(nums == &nums)
puts("nums == &nums");
else
puts("nums != &nums");
if((nums + 1) == (&nums + 1))
puts("(nums + 1) == (&nums + 1)");
else
puts("(nums + 1) != (&nums + 1)");
printf("nums: %i\n", nums);
printf("&nums: %i\n", &nums);
printf("nums + 1: %i\n", nums + 1);
printf("&nums + 1: %i\n", &nums + 1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到的nums == …
我正在用C编程语言练习编程,并正在尝试使用该rename()
函数.我使用以下代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
if(rename ("data", "database") )
{
fprintf(stderr, "Can't rename file\n");
exit(EXIT_FAILURE);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码将名为"data"的文件的名称更改为名为"database"的文件.我想知道如果您尝试运行此代码会发生什么,但在同一目录中已经有一个名为"database"的文件.
这是我在运行rename()
函数之前所拥有的目录的内容:
这是运行该rename()
函数后我所拥有的目录的内容:
看起来该rename()
函数确实正确地重命名了我的文件,但它也删除了该目录中已经具有相同名称的文件.我想知道这个rename()
功能是如何工作的,或者这是我的操作系统(Windows 10-cygwin64-gcc编译器)正在做的事情.此外,在使用此功能时,我应该首先检查以确保没有已经具有相同名称的文件以防止它们被删除吗?感谢您的帮助和见解.
我最近一直在研究表示数字的一个补码系统,根据我的理解,数字0有两个变量.有一个负零(-0)和一个正零(+0).
我的问题是,在一个补码架构中,这个异常在C中究竟是如何处理的?C是否区分-0和+0,或者这两种形式都被视为零.
如果在测试零时,+ 0和-0都返回TRUE,那么我想知道如果我们输入-0作为输入,下面的示例代码将如何工作以计算整数中的设置位数.
int bitcount(int x)
{
int b;
for (b = 0; x != 0; b++)
x &= (x-1);
return b;
}
Run Code Online (Sandbox Code Playgroud)
由于-0,在一个补码中,其所有位都设置为1,-0应该返回由任何其他数字设置的最高位数; 但是,看起来这个代码会使循环测试条件失败x != 0
,甚至不会进入循环,从而产生不正确的结果.
在C语言中,在一个补码架构中,是否有可能使循环条件对正零敏感,如下所示:x != +0
另外,如果我从+0中减去1,我会得到-0或-1.换句话说,在一个补码架构中,+ 0 - 1 = -0?
总而言之,在本次讨论中不要偏离太远,我只是想知道C如何处理一个补码架构中数字0的特殊性.
我是C的新手,我正在尝试使用多维数组.我有以下示例,我正在尝试初始化多维数组:
char matrix[5][10];
matrix[0] = {'0','1','2','3','4','5','6','7','8','9'};
matrix[1] = {'a','b','c','d','e','f','g','h','i','j'};
matrix[2] = {'A','B','C','D','E','F','G','H','I','J'};
matrix[3] = {'9','8','7','6','5','4','3','2','1','0'};
matrix[4] = {'J','I','H','G','F','E','D','C','B','A'};
Run Code Online (Sandbox Code Playgroud)
乍一看似乎这种类型的声明是有效的,因为多维数组是一个数组数组; 但是,这个例子无法正确编译,我不完全确定为什么.
我知道我能够使用以下表示法初始化多维数组:
char matrix2[5][10] =
{
{'0','1','2','3','4','5','6','7','8','9'},
{'a','b','c','d','e','f','g','h','i','j'},
{'A','B','C','D','E','F','G','H','I','J'},
{'9','8','7','6','5','4','3','2','1','0'},
{'J','I','H','G','F','E','D','C','B','A'},
};
Run Code Online (Sandbox Code Playgroud)
但是,如果我在声明时不知道数组的内容并希望稍后用数据填充此数组,该怎么办?我可以按如下方式初始化每个元素:
matrix[0][0] = '0';
matrix[0][1] = '1';
matrix[0][2] = '2';
etc....
Run Code Online (Sandbox Code Playgroud)
我想知道是否有可能使用我原来的方法声明每个数组:
matrix[0] = {'0','1','2','3','4','5','6','7','8','9'};
matrix[1] = {'a','b','c','d','e','f','g','h','i','j'};
etc...
Run Code Online (Sandbox Code Playgroud)
我尝试使用strcpy
如下:
strcpy(matrix[0], "012345678");
strcpy(matrix[1], "abcdefghi");
Run Code Online (Sandbox Code Playgroud)
看起来如果多维数组是一个以空字符结尾的字符串数组,这可能会起作用,但是它会等同于整数或其他数据结构的多维数组.任何帮助表示赞赏.谢谢.