2013-03-01 62 views
2

什么是这两个声明之间的区别:C中下列声明有什么区别?

char (*ptr)[N]; 

char ptr[][N]; 

感谢。

+0

[cdecl](http://cdecl.org/)很棒。 (尽管它叫第一个语法错误。) – 2013-03-01 20:09:44

+0

(不喜欢ptr作为var名称,并且需要字面维数。) – 2013-03-01 20:17:01

回答

4

(1)声明

char (*ptr)[N]; 

ptrpointer to char array of size N下面的代码将帮助你如何使用它:

#include<stdio.h> 
#define N 10 
int main(){ 
char array[N] = "yourname?"; 
char (*ptr)[N] = &array; 
int i=0; 
while((*ptr)[i]) 
    printf("%c",(*ptr)[i++]); 
} 

输出:

yourname? 

参见: Codepad

(2.A)

凡为char ptr[][N];是一个无效的表达产生了错误:array size missing in 'ptr'

但是char ptr[][2] = {2,3,4,5};是一个有效的声明,它是2D char数组。下面的例子:

int ptr[][3] = {{1,2,3,4,5}, {5,6,7,8,9}, {6,5,4,3,2}}; 

创建的3行5个COLS一个int数组。 Codepade-Example

(2.B)功能参数的特例!

由于函数参数char ptr[][N];是一个有效的表达式。这意味着ptr可以指向一个2D char array of N columns

例如:阅读在输出注释

#include <stdio.h> 
int fun(char arr[][5]){ 
    printf("sizeof arr is %d bytes\n", (int)sizeof arr); 
} 
int main(void) { 
    char arr[][6] = {{'a','b'}, {'c','d'}, {'d','e'}}; 
    printf("sizeof arr is %d bytes\n", (int)sizeof arr); 
    printf("number of elements: %d\n", (int)(sizeof arr/sizeof arr[0])); 
    fun(arr); 
    return 0; 
} 

输出:

sizeof arr is 6 bytes // 6 byte an Array 2*3 = 6 
number of elements: 3 // 3 rows 
sizeof arr is 4 bytes // pointer of char 4 bytes 

要查看运行这个例子:codepad

+0

OP可能意味着要求区分2种类型而不是2种声明。 'char ptr [] [N]'是函数参数的有效描述。 – SomeWittyUsername 2013-03-01 12:03:27

+0

@icepack我想他可能会问函数指针,然后他指定,他还加了一个';'。为什么。任何方式你**正确** – 2013-03-01 12:05:56

+0

@icepack巧合是我问[第二次关于函数参数](http://stackoverflow.com/questions/15151803/pass-pointer-array-to-function?answertab=active #tab-top)今天。好点子。 – 2013-03-01 12:13:52

1

第一声明了一个指针到一个N-长阵列,所述其他人声明了两个二元数组。 注意:他们可以用来实现类似的功能,但他们的意思不一样!

2

首先是声明PTR作为指针炭的数组n
第二个是声明PTR为阵列N阵列炭

PLZ参阅link

0

1.ptr被指针字符数组大小为N 2. ptr看起来像一个二维数组,但不提供行数。在二维数组中,行和列的数量都是强制的,因为编译器将决定应该为数组分配多少个字节((行数*列数*数据类型的大小)。该声明可以正常工作,如下所示:

char[][2]={ 
      {'a','b'} 
      }; 

因为这里编译器会查看并理解有一行。或者当一个二维数组作为函数参数传递时,列的数量(第二维)必须由强制提供,行在函数定义中不是强制的。