[这是一个受到其他地方最近讨论的启发的问题,我会用它来提供答案.]
我想知道数组"衰减"指针的奇怪C现象,例如当用作函数参数时.这似乎是不安全的.用它明确地传递长度也是不方便的.我可以通过其他类型的聚合 - 结构 - 完全符合价值; 结构不会腐烂.
这个设计决定背后的理由是什么?它如何与语言集成?为什么结构有区别?
代码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中声明如何正确?
(常见问题解答-此问题不断出现)
我假设读者知道指针算法是如何工作的。
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
我试图理解这两个 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
我们来看看下面的代码:
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)吗?
在下面的代码中,我将变量设置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。
我认为索引运算符[]返回该值存储的值。