c - string[10][20] 类型的 2D 字符串与 C 中 *string [10][20] 类型的 2D 字符串有什么区别?
问题描述
我是 C 的初学者,我使用 CodeBlocks for Windows。
我了解到字符串是一个字符序列(字符),但我需要一个字符串序列。
在一个视频中,我看到如果我在我的字符串中使用一个指针(以前是char string[20][10]
,现在是char* string[20][10]
),我可以将字符串的每个“空格”打印为字符串而不是char
. (我的意思是,例如,空格string[0][0]
)。但是后来我尝试strcpy()
在该字符串的两个空格中使用,但程序不起作用。谁能告诉我为什么会发生这种情况以及指针在这种字符串中发生了什么变化?
编辑:这是不起作用的代码:
#include <stdio.h>
#include <string.h>
int main()
{
int i, j;
char* array[3][10];
for(i = 0; i != 3; i++)
{
for(j = 0; j != 10; j++)
{
if(i == 0)
{
array[i][j] = "ABC";
}
else if(i == 1)
{
array[i][j] = "DEF";
}
else if(i == 2)
{
array[i][j] = "GHI";
}
}
}
for(i = 0; i != 3; i++)
{
for(j = 0; j != 10; j++)
{
printf("%s", array[i][j]);
}
printf("\n");
}
strcpy(array[2][0], array[1][0]);
return 0;
}
(这不是实际代码,我有一个问题在这里很难解释。但是如果您在阅读此代码后仍然觉得这个问题令人困惑,我将尝试解释原始问题)。
解决方案
我将间接回答您的问题,因为我认为从根本上您需要了解的是数组和指针之间的区别。
C 可能会使初学者感到困惑,因为它对指针和数组使用相同的语法。在数组中,它为所有元素定义空间,并a[n]
检索元素n
。ifa
是一个指针,它只为指针定义空间,并a[n]
指n
从任何点开始的第 th 位置a
。如果a
是一个数组,你仍然可以使用指针语法 *(a + n)
来引用a[n]
. 就此而言,n[a]
你也会得到同样的结果。
有经验,语法很方便。正如我所说,对于学生来说,对两个概念使用相同的语法可能会造成混淆。
这两个概念都出现argv
在您的main
程序中:
int main( int argc, char *argv[] )
是什么argv
?什么是argv[0]
?
argv
不是字符串。这是一个数组。什么数组?每个元素(当然包括第一个元素)都是一个char *
,一个指向字符的指针。对一个字符。碰巧的是,该字符后面可能跟着另一个,另一个,在...字符串中...直到 NUL 字符,指示终点。
中的每个元素argv
都是固定大小:sizeof(char*)
. 的长度由argv
给出argc
。每个元素指向的每个字符串的长度在编译时是未知的;这取决于调用程序时传递给程序的参数。
记住,argv
你会发现你的定义char* array[3][10]
更容易理解。您还声明了一个char *
. 您还没有做的是操作系统在调用时所做的事情main
:为它们定义要指向的东西,并将它们的地址分配给指针。
使用指针时,总是要问,它指向什么?指针在哪里分配了值,以及该内存是如何分配的(静态、动态或自动)?如果您不确定,系统提醒您它也不知道只是时间问题。
推荐阅读
- javascript - 如何将画布的宽度和高度设置为浏览器的所有高度和宽度而不会溢出?
- grails - 防止 Grails fieldValue 格式化数字
- ajax - 如何通过获取请求而不抛出错误来获取 ajax 调用
- java - 获取 ArrayList 列表
- java - Java:间歇性地解析 CSV 文件无法读取 File 中的 170K 行
- angular - 如何隐藏 FormIO 中的警报危险?
- sql - 对变量a进行转换和求和,按变量b分组
- r - 我可以在 CentOS 上安装 `caret` 吗?
- sql - MS SQL 报表生成器表达式
- rspec - Capybara RSpec 匹配器等待元素?