【问题标题】:value of pointer to a char array vs plain char pointer指向 char 数组的指针与普通 char 指针的值
【发布时间】:2012-04-10 18:18:18
【问题描述】:

我很难理解在哪里可以使用指向数组的指针, 例如:char (*a)[10];。 所以两个基本问题。

  1. 请给我一个简单的例子,说明如何在 C 代码中使用指向数组的指针。
  2. 为什么要使用它而不是将变量声明为指针,然后在该点之后递增/递减地址。

【问题讨论】:

  • 我们的数据库中有很多可能重复的这个问题,我不知道从哪里开始。使用搜索框。 :)
  • 我认为你在倒退。与其试图找到一个可以用 X 类型解决的问题,不如从一个问题开始,然后弄清楚如何解决它……
  • 我认为你们都没有抓住重点。 OP 在问为什么括号的语法糖比简单地有一个恰好指向数组的 char 指针更好。
  • 我更改了标题,希望能更好地引出 OP 问题的第二点。如果我误解了什么,请随时回滚。

标签: c arrays pointers


【解决方案1】:

假设您有一个返回一组字符串的数据库查询。此外,假设您知道这些字符串的长度不超过 9 个字符。只是,您不知道查询返回的集合中有多少元素。

char (*a)[10] = malloc( NumRecords * sizeof *a );
if ( a == NULL )
{
  /* Handle error appropriately */
  return EXIT_FAILURE; /* Naive */
}

for ( i = 0 ; i < NumRecords ; ++i )
{
  assert(strlen(DbRecordSet[i]) < 10);
  strcpy(a[i], DbRecordSet[i]);
}

【讨论】:

    【解决方案2】:

    示例:如何打印num_row行3列数组的元素:

    #include <stdio.h>
    
    #define NUM_ROW(x) (sizeof (x) / sizeof *(x))
    
    // print elements of an array of num_row rows and 3 columns
    void print(int (*a)[3], size_t num_row)
    {
        size_t num_col = sizeof *a / sizeof **a;
    
        for (int i = 0; i < num_row; i++) {
            for (int j = 0; j < num_col; j++) {
                printf("%d\n", a[i][j]);
            }
        }
    }
    
    int main(void)
    {
        int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
        int b[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    
        print(a, NUM_ROW(a));
        print(b, NUM_ROW(b));
    
        return 0;
    }
    

    【讨论】:

    • 这样做的缺点是print 仅适用于 Nx3 数组;如果要打印 Nx4 数组,则必须使用不同的函数。
    【解决方案3】:

    每当您将具有多维数组类型的表达式传递给函数时,您都将使用指向数组的指针:

    int a[10][20];
    foo(a);
    
    void foo(int (*p)[20]) // or int p[][20] 
    { ... }
    

    【讨论】:

      猜你喜欢
      • 2018-04-05
      • 2016-01-27
      • 2021-01-26
      • 2021-11-26
      • 2017-09-03
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多