Tag: 数组

C中文件范围的可变修改数组

我有一些像这样的代码: static int a = 6; static int b = 3; static int Hello[a][b] = { { 1,2,3}, { 1,2,3}, { 1,2,3}, { 1,2,3}, { 1,2,3}, { 1,2,3} }; 但是当我编译它时,它说错误: 在文件范围内可变地修改了“Hello” 怎么会发生这种情况? 我该怎么办呢?

为什么数组名称是指向数组第一个元素的指针?

总是这样,我的意思是,数组名称始终是指向数组的第一个元素的指针。为什么它是这样的?它是实现有点事物还是语言特征?

在c中将文本文件读入数组

将文本文件读入动态一维数组的最有效方法是什么? 在每次读取char之后重新分配似乎很愚蠢,在每个读取行之后重新分配似乎不太好。 我想将整个文件读入数组。 你会怎么做?

C指向二维数组

我知道有几个问题可以提供良好(和工作)的解决方案,但没有恕我直言,这清楚地说明了实现这一目标的最佳方法。 所以,假设我们有一些2D数组: int tab1[100][280]; 我们想要制作一个指向这个2D数组的指针。 为实现这一目标,我们可以做到: int (*pointer)[280]; // pointer creation pointer = tab1; //assignation pointer[5][12] = 517; // use int myint = pointer[5][12]; // use 或者,或者: int (*pointer)[100][280]; // pointer creation pointer = &tab1; //assignation (*pointer)[5][12] = 517; // use int myint = (*pointer)[5][12]; // use 好的,两者似乎都运作良好。 现在我想知道: 什么是最好的方式,第一或第二? 两者都等于编译器? (速度,性能…) 这些解决方案中的一种比其他解决方案占用更多内存? 开发人员更常使用的是什么?

C中未知矩阵的Dynamica分配

我需要获取用户输入的文件并将其乘以另一个文件。 我知道该怎么做。 问题是一个文件是一个数组,另一个是矩阵。 我需要在矩阵的第一行扫描以找到矩阵的大小,然后我需要从文件中动态分配矩阵和数组。 这是我到目前为止: #include #include #include #include int main() { int row1, col1; //These values need to be pulled from the first file// char filename1[100]; //Setting the file name for entry and setting the limit to 100// FILE* fp1; //FILE must be set as a pointer (FILE must also be capitalized)// printf(“Enter file […]

何时数组名称或函数名称“转换”为指针? (在C中)

1) 误解 : 每当使用C语言声明数组时,都会隐式创建指向数组第一个元素的指针(数组的名称)。 (是吗?我不这么认为!) 这个页面的前两行(虽然我不确定信息的正确性)说明相同。 正如我们所看到的,当我们声明一个数组时,为数组的单元分配一个连续的内存块,并且还分配一个指针单元(适当类型)并初始化为指向数组的第一个单元。 但是当我输出该指针中包含的地址和该指针的地址时 ,它们会变成相同的。 所以,我认为毕竟不会创建指针。 2)我从这个问题中选了这个 。 在大多数情况下,数组名称将转换为指针。 任何人都可以详细解释编译器何时决定将数组名转换为指针, 为什么 ? PS:请解释一下function 。 同样在这个链接中,给出了一个例子,说对于函数int square(int,int) ,任何square , &square , *square , **square指向相同的函数指针。 你可以解释吗? 编辑:代码段 int fruits[10]; printf(“Address IN constant pointer is %p\n”, fruits); printf(“Address OF constant pointer is %p\n”, &fruits); 输出: Address IN constant pointer is 0xbff99ca8 Address OF constant […]

如何可靠地获得C型arrays的大小?

如何可靠地获得C风格数组的大小? 通常建议的方法似乎是使用sizeof ,但它在foo函数中不起作用,其中x被传入: #include void foo(int x[]) { std::cerr << (sizeof(x) / sizeof(int)); // 2 } int main(){ int x[] = {1,2,3,4,5}; std::cerr << (sizeof(x) / sizeof(int)); // 5 foo(x); return 0; } 这个问题的答案推荐sizeof但他们并没有说它(显然?)如果你传递数组不起作用。 那么,我是否必须使用哨兵? (我不认为我的foo函数的用户总是可以信任最后放一个标记。当然,我可以使用std::vector ,但是我没有得到漂亮的速记语法{1,2,3,4,5} 。)

数组类型 – 指定/用作函数参数的规则

当我需要将一个数组传递给一个函数时,似乎所有以下函数声明都可以工作 void f(int arr[]) void f(int arr[4]) // is this one correct? 为了这: int a[]={1,2,3,4}; f(a); 但是当我将一个数组分配给另一个数组时,它就失败了 int a[]={1,2,3,4}; int b[4] = a; // error: array must be initialized with a brace-enclosed initializer 那么为什么作为函数的参数传递的数组是可以的,但是在简单赋值的rhs上使用是错误的?

初始化固定大小的char数组时没有编译器错误,没有足够的空间用于null终止符

假设我有以下c char数组: char okaysize4[5] = “four”; // line 5 char toosmall4[4] = “four”; // line 6 char toosmall3[3] = “four”; // line 7 当我用gcc 4.4.7编译时,我收到以下错误: array.c:7:警告:chars数组的初始化字符串太长 第7行预计会出现此错误,因为我试图将5个字符(“four” + \0)填充到3个元素数组中。 第5行也不会出现错误,因为5元素数组足够大。 但是我很惊讶第6行没有类似的错误。最终在toosmall4初始化的是一个未toosmall4的字符串,这可能会导致各种麻烦。 我的理解是,由于null终止符,c字符串文字”four”应该是五个字符长。 实际上sizeof(“four”)是5.那么为什么编译器不会在这里给出错误? 有什么方法可以改变我的声明/定义/初始化,以便在这种情况下标记错误?

为什么C中的数组会衰减到指针?

[这是一个受到其他地方最近讨论的启发的问题,我会用它来提供答案。] 我想知道数组“衰减”指针的奇怪C现象,例如当用作函数参数时。 这似乎是不安全的。 用它明确地传递长度也是不方便的。 我可以通过其他类型的聚合 – 结构 – 完全符合价值; 结构不会腐烂。 这个设计决定背后的理由是什么? 它如何与语言集成? 为什么结构有区别?