C 数组和指针是不同的

C 数组和指针是不同的,c,arrays,pointers,char,C,Arrays,Pointers,Char,我目前正在通过K&R学习C。作者对指针和数组的行为做了一个重要的区分,但它们是不同的,因为指针是一个变量,可以指向不同的东西,而数组没有这种能力 我理解这一点,但以下代码让我有点困惑: int len, nlines; char *p, line[MAXLINES]; /* Confusing part */ 我知道当你把一个数组传递给一个函数时,它会退化成一个指针,但是在这里你可以在同一行声明一个字符指针和一个字符数组,即使它们是不同的?也许我把自己搞糊涂了,但这对我来说很奇怪。谢谢 这只

我目前正在通过K&R学习C。作者对指针和数组的行为做了一个重要的区分,但它们是不同的,因为指针是一个变量,可以指向不同的东西,而数组没有这种能力

我理解这一点,但以下代码让我有点困惑:

int len, nlines; 
char *p, line[MAXLINES]; /* Confusing part */

我知道当你把一个数组传递给一个函数时,它会退化成一个指针,但是在这里你可以在同一行声明一个字符指针和一个字符数组,即使它们是不同的?也许我把自己搞糊涂了,但这对我来说很奇怪。谢谢

这只是在同一行上声明多个变量,相当于:

char *p; // Pointer
char line[MAXLINES]; // Fixed-sized character array

除了它们的基类型和它们在源代码中声明的位置之外,它们之间没有任何关系。

据我所知,这一点实际上并不令人困惑。如果查看该行,代码中的
*p
行[MAXLINES]
分开。因此,用户声明了两个不同的变量

你可以这样看:

char *p; //Pointer due to the asterik (*)
char line[MAXLINES]; //Array because of []
同样的事情也发生在
int len,nline上

int len; //First int var
int nlines; //Second int var

我们只在一行上写var,只是为了让它看起来干净。除此之外,两者之间没有区别。

它们在所有方面都是一样的 可以声明指针并将其用作数组

int *ptr,arr[10],value=5;
ptr[0]=value;
*(arr)=value;

但区别在于数组是常量指针

如果它们都具有相同的“根”类型,则可以在一行上声明多个内容,例如
int w,x,y[5],z(void)声明两个int、一个int数组和一个返回int的函数。有些人不鼓励这种做法,他们更喜欢每个声明一个标识符。p是指向char的指针。line是字符的MAXLINES大小的数组。这里令人困惑的是变量可以“修改”根类型。因此,
chara、*b、**c
将声明单个字符
a
、指向字符
b
的指针以及指向字符
c
的指针。类似地,当在类似的声明样式中使用时,数组“修改”根类型。因此,这就是为什么我见过的大多数现代C开发人员推荐中描述的声明样式,而不是在单个声明行上。这是错误的,指针不是数组,
ptr
指向零,
value
没有初始化。你调用了未定义的行为。噢,我知道它没有初始化,假设它是任何数字
ptr
仍然未初始化,所以
ptr[0]
调用了未定义的行为。此外,数组和指针“在所有方面都不相同”,数组也不是常量指针。@Thomas这与strcpy()的
strcpy()毫无关系。
。这是关于声明变量的。对不起,编辑器不好,所以看起来很糟糕!,这些天我在做这个例子,对于这两个声明,我接着做了字符串复制,我发现了这个错误:
#include#include int main(){char*p;char line[]={h','e','l','l','l','o','0'};strcpy(p,line);return 0;}
,然后我突然发现有人在问同样的问题,我在字符串cpy中发现,它会导致这个错误,thx背后的任何原因@Thomas这纯粹是在讨论如何声明不同类型的变量,而不是如何为
strcpy()
操作准备字符串缓冲区。为此,如果手头有POSIX,您需要使用
strdup()
,或者使用
malloc(strlen(src)+1)
strcpy()
的组合来实现类似的工作。