【问题标题】:What is the difference between the following declarations in C?C中的以下声明有什么区别?
【发布时间】:2013-03-01 11:53:49
【问题描述】:

这两个声明有什么区别:

char (*ptr)[N];

对比

char ptr[][N];

谢谢。

【问题讨论】:

  • cdecl 很棒。 (虽然它称第一个为语法错误。)
  • (不喜欢 ptr 作为 var 名称,想要文字维度。)

标签: c pointers declaration


【解决方案1】:

(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}; 是一个有效的声明,它是二维字符数组。下面的例子:

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

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

(2.B) 函数参数的特殊情况!

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

示例:在输出中读取 cmets

#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

【讨论】:

  • OP 可能是要询问两种类型之间的区别,而不是两种声明。 char ptr[][N] 是函数参数的有效描述。
  • @icepack 我想他可能会问不是函数指针然后他指定,他还添加了一个;。为什么。你是正确的任何方式
  • @icepack 巧合的是我今天被问到second time about function parameter。好点。
  • 10 倍。我做对了吗:在第一种情况下 ptr 是指向 char 数组的指针,而在第二种情况下 ptr 是指向 2D char 数组的指针?
  • @user1980750 请参见char ptr[][2] = {2,3,4,5};ptr 不是指针而是 char 二维数组。但是如果char ptr[][N];出现在像fun(char ptr[][2])这样的函数参数中,那么ptr就是指针
【解决方案2】:

首先是将ptr声明为指向char数组N的指针
其次是将ptr声明为char数组N的数组

请参考link

【讨论】:

    【解决方案3】:

    第一个声明一个指向 N 长数组的指针,另一个声明一个二元数组。 注意:它们可以用来实现类似的功能,但它们的意思不一样!

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-30
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 2011-11-09
        • 1970-01-01
        • 2013-09-11
        相关资源
        最近更新 更多