2017-04-10 57 views
0

我目前正在通过K & R学习C.作者提出了一个重要的区别,即指针和数组的行为相似,但它们不同,因为指针是一个变量,可以指向不同的东西而阵列没有这个能力。数组和指针不同

我明白这一点,但下面的代码混淆了我一点点:

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

我知道,当你传递一个数组给它衰变为指针的功能,但在这里,你可以声明一个字符指针和字符数组在同一行,即使它们不同?也许我很迷惑自己,但这对我来说很奇怪。谢谢!

+3

您可以在同一行声明多个事情,如果他们都具有相同的“根”类型,例如'int w,x,y [5],z(void);'声明两个int,一个int数组和一个返回int的函数。有些人不鼓励这种做法,每个声明更喜欢一个标识符。 –

+0

p是一个指向char的指针。行是char的MAXLINES大小的数组。 –

+0

这里令人困惑的是变量可以'修改'根类型。因此'char a,* b,** c'将会声明一个单独的字符'a',一个指向字符'b'的指针以及一个指向字符'c'的指针。类似地,当用于类似的声明风格时,数组'修改'根类型。因此,这就是为什么我见过的大多数现代C开发人员推荐在[tadman的回答](http://stackoverflow.com/a/43334568/510036)中描述的声明风格,而不是在单个声明行上。 – Qix

回答

3

这只是宣布在同一行多个变量和等效于此:

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

他们不是在比他们的基本类型以外的任何方式有关,他们在源代码中被宣布。

0

从我记得,其实并没有让人困惑。如果您查看该行,代码中的,分隔为*plines[MAXLINES]。因此,用户声明了两个不同的变量。

你可以看一下这个喜欢:

char *p; //Pointer due to the asterik (*) 
char line[MAXLINES]; //Array because of [] 

同样的事情会在int len, nlines;

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

我们只在一行上写var以使它看起来干净。除此之外,两者没有区别。

-3

他们是一切事物的相同 你可以声明一个指针,并把它作为数组

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

,但不同的是数组常量指针

+2

这是错误的,一个指针不是一个数组,'ptr'指向无,'value'没有被初始化。你调用未定义的行为。 – mch

+0

哦,请知道它没有初始化假设它是任何数字 –

+0

'ptr'仍然未初始化,所以'ptr [0]'调用未定义的行为。数组和指针也不是“一切都一样”,数组也不是常量指针。 – mch