相关疑难解决方法(0)

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

[这是一个受到其他地方最近讨论的启发的问题,我会用它来提供答案.]

我想知道数组"衰减"指针的奇怪C现象,例如当用作函数参数时.这似乎是不安全的.用它明确地传递长度也是不方便的.我可以通过其他类型的聚合 - 结构 - 完全符合价值; 结构不会腐烂.

这个设计决定背后的理由是什么?它如何与语言集成?为什么结构有区别?

c arrays pointers

20
推荐指数
2
解决办法
2991
查看次数

char*argv []和char**argv之间的差异,为main()的第二个参数

代码1

#include<stdio.h>

int main(int argc, char *argv[])
{
int j;
printf("%d", argv[1][0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

代码2

#include<stdio.h>

int main(int argc, char **argv)
{
int j;
printf("%d", argv[1][0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

CODE 1和CODE 2都提供相同的输出.但是CODE 1和CODE 2中主要功能的参数2是不同的.在编译时在数据部分上创建指针数组.argv是指针数组.然后我们应该在main函数中声明参数作为指向字符的指针,即**argv.在CODE 1中声明如何正确?

c arrays pointers parameter-passing argv

17
推荐指数
3
解决办法
4万
查看次数

指针是否支持“数组样式索引”?

(常见问题解答-此问题不断出现)

我假设读者知道指针算法是如何工作的。

int arr[3] = {1,2,3};
int* ptr = arr;
...
*(ptr + i) = value;
Run Code Online (Sandbox Code Playgroud)

老师/ C书籍不断告诉我,我不应该*(ptr + i)像上面的示例那样使用,因为“指针支持数组样式索引”,而我应该使用它ptr[i] = value;。那里没有论据-更容易阅读。

但是从C标准来看,我什么都没有找到,叫做“数组样式索引”。实际上,运算符[]并不期望任何一个操作数都是数组,而是指针或整数!

6.5.2.1数组下标

约束条件

其中一个表达式的类型应为“完成对象类型的指针”,另一个表达式的类型应为整数,结果的类型应为“ type ”。

为什么数组下标运算符不期望数组?标准错了吗?我的老师/ C书困惑了吗?

c arrays pointer-arithmetic subscript-operator array-indexing

5
推荐指数
1
解决办法
111
查看次数

C 中的 char 数组比 char 指针更有效吗?

我试图理解这两个 char 声明之间的内在区别:

char* str1;
char str2[10];
Run Code Online (Sandbox Code Playgroud)

我知道 usingchar*给出了指向 中第一个字符的指针str1,而char[10]结果是一个长度为 10 个字节的数组(因为char是一个字节......我记得在某些编码中它可以更多,但我们假设一个字节把事情简单化)。

我的问题是,当实际为它们赋值时,数据显然必须存储在某个地方,并且在char[10]我们预先告诉编译器分配十个字节的情况下,而在char*我们实际上只是说分配一个指向单字节。但是如果我们分配的字符串str1超过一个字节会发生什么,它是如何分配的呢?还需要做多少工作才能适当分配?另外,如果我们想重新分配str1比之前分配的更长的值,会发生什么,如何分配?

由于处理 时从编译器的角度来看存在不确定性,当我提前知道长度或想要限制开始时的长度时,char pointers使用 a 是否更有效?char array

c arrays pointers dynamic-memory-allocation

5
推荐指数
2
解决办法
1382
查看次数

C中的数组是指针的语法糖吗?

我们来看看下面的代码:

int arr[n];
// s.t. i<n
arr[i] = 12;
// s.t. i<n 
*(arr + i) = 12;
Run Code Online (Sandbox Code Playgroud)

arr[i]一种合成糖*(arr+ i)吗?

c syntactic-sugar

3
推荐指数
2
解决办法
924
查看次数

指针索引

在下面的代码中,我将变量设置var为 20,然后将指针ptr设置为var. 然后该指针ptrptr保存了该指针的内存地址ptr

#include <stdio.h>

void pointers()
{
    int var = 20;
    int* ptr;
    ptr = &var;

    int *ptrptr = ptr;

    printf("Value at ptrptr[0] = %d \n", ptrptr[0]);
}

// Driver program
int main()
{
    pointers();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Value at ptrptr[0] = 20
Run Code Online (Sandbox Code Playgroud)

为什么ptrptr[0]返回存储的值val,而不是指针的内存地址ptr

我认为索引运算符[]返回该值存储的值。

c pointers

1
推荐指数
1
解决办法
209
查看次数