gpt4 book ai didi

c - ANSI C 通过指针处理 2 个暗淡数组

转载 作者:太空宇宙 更新时间:2023-11-04 05:52:52 25 4
gpt4 key购买 nike

很久很久以前,我经常使用 C 但忘记了一切。现在我正在尝试解决简单的任务但失败了。

我想编写接受 2dim 数组或 char* 并打印它的函数。但是我的代码有问题,我不明白为什么。据我了解 products 是指向 2dim 数组的指针,因此将其增加到 i * sizeof(char**) 我得到指向子数组的指针,并增加该子数组pointer 我得到指向 char block 的指针。但似乎我的代码正在寻找不同的内存块。

关于 products 数组 - 我知道它有 N 行和 2 列。

#include <stdio.h>
#include <string.h>

void print(char*** products, size_t rows, size_t cols) {
size_t i;

for(i = 0; i < rows; i++) {
printf("Col1: '%s. Col2: %s'\n",
(products + i * sizeof(char**)),
(products + i * sizeof(char**) + sizeof(char*))
);
}
}

int main(void) {
const char* a[][3] = {{"abc", "1"}, {"def", "2"}, {"ghi", "3"}};
print((char***)a, 3, 2);

return 0;
}

最佳答案

声明中定义的数组

const char* a[][3] = {{"abc", "1"}, {"def", "2"}, {"ghi", "3"}};

类型为 const char *[3][3]

考虑到数组有三个“列”,在数组声明中明确指定了 3 列。

const char* a[][3] =....
^^^

最后一列中的元素由 NULL 初始化。

当在表达式中使用数组作为参数时,它会显式转换为指向其第一个元素的指针。

也就是说,如果您使用上面显示的数组作为参数,那么它会被转换为类型

const char * ( * )[3]

char ***不是同一种类型

所以函数应该这样声明

void print( const char * ( *products )[3], size_t rows );

或者喜欢

void print( const char * products[][3], size_t rows );

函数应该这样调用

print( a, 3 );

您可以再指定一个参数来设置您想要输出的列数

void print( const char * ( *products )[3], size_t rows, size_t cols );

在这种情况下,函数可以这样调用

print( a, 3, 2 );

然而数组本身在任何情况下都有 3 列。:)

或者如果编译器支持像这样的可变长度数组

void print( size_t rows, size_t cols, const char * ( *products )[cols] );

或为了可读性

void print( size_t rows, size_t cols, const char * products[rows][cols] );

也可以这样称呼

print( 3, 3, a );

这是一个演示程序,展示了函数声明的两种方式

#include <stdio.h>
#include <string.h>

#define N 3

void print1( const char *product[][N], size_t rows )
{

for ( size_t i = 0; i < rows; i++ )
{
for ( const char **p = product[i]; *p; ++p )
{
printf( "%s ", *p );
}
printf( "\n" );
}
}

void print2( size_t rows, size_t cols, const char *product[rows][cols] )
{

for ( size_t i = 0; i < rows; i++ )
{
for ( const char **p = product[i]; *p; ++p )
{
printf( "%s ", *p );
}
printf( "\n" );
}
}


int main( void )
{
const char * a[][N] =
{
{ "abc", "1" },
{ "def", "2" },
{ "ghi", "3" }
};

print1( a, N );
printf( "\n" );

size_t n = N;

const char * b[n][n];

memcpy( b, a, sizeof( a ) );

print2( n, n, b );
printf( "\n" );
}

它的输出是

abc 1 
def 2
ghi 3

abc 1
def 2
ghi 3

请注意,如果编译器支持可变长度数组,则可能不会对其进行初始化,然后对其进行定义。

关于c - ANSI C 通过指针处理 2 个暗淡数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35033094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com