如何在c中使用多个指向一个二维数组的指针?
How to use several pointers to one twodimensional array in c?
我想在 c 中的数组上创建指针。例如,我有一个数组
char arr1[4][20];
我想制作指针,这些指针会像这个指针一样获得内存 p = arr1[0][0-20]
t = arr1[1][0-20],u = arr[1][0-20]。我想将来自不同文件的所有字符串保存在一个数组中。
我尝试做类似的事情,但它不起作用。
char name[20][20];
char *s[20];
char *t[20];
s = name[1];
t = name[2];
以下是声明指向 20 个元素的数组的指针的方法:
char (*ptr)[20];
所以,这就是你做你想做的事的方式:
char name[20][20];
char (*s)[20] = &name[1]; // note the &
char (*t)[20] = &name[2];
下面是您稍后访问这些数组元素的方式:
for (size_t i = 0; i < sizeof(*s); ++i) {
printf("%d ", (*s)[i]);
}
这样声明的数组
char name[20][20];
用在表达式中,例如初始化器被隐式转换为指向其第一个类型为 char ( * )[20]
.
的元素的指针
所以你可以这样写
char ( *s )[20] = name;
在这种情况下,例如要遍历指针 s 指向的数组的字符元素,您需要使用像
这样的表达式
( *s )[0], ( *s )[1], an so on
或喜欢
s[0][0], s[0][1], and so on.
如果指针声明为
,遍历指向的字符数组会更简单
char *s = name[0];
char *t = name[1];
等等。
所以要么你应该像这样声明指针
char ( *s )[20] = name;
char ( *t )[20] = name + 1;
或喜欢
char *s = name[0];
char *t = name[1];
您可以通过使用指针赋值的简短练习来完善您的问题。例如从上面的评论继续,创建 myptr
作为 指针到数组 的 char[20]
和 s
和 t
到 char[20]
的数组,你可以这样做:
#include <stdio.h>
int main (void) {
const char name[20][20] = { "Mickey Mouse", "Minnie Mouse", "Pluto",
"Bugs Bunny", "Porky Pig", "Daffy Duck", "" },
(*myptr)[20] = name;
while (1) {
const char *s = *myptr++, *t = *myptr++;
if (*s)
puts (s);
else
break;
if (*t)
puts (t);
else
break;
}
}
例子Use/Output
$ ./bin/ptr2arrexercise
Mickey Mouse
Minnie Mouse
Pluto
Bugs Bunny
Porky Pig
Daffy Duck
问题:空字符串作为上面代码中name
的最后一个元素有什么用?
我想在 c 中的数组上创建指针。例如,我有一个数组
char arr1[4][20];
我想制作指针,这些指针会像这个指针一样获得内存 p = arr1[0][0-20] t = arr1[1][0-20],u = arr[1][0-20]。我想将来自不同文件的所有字符串保存在一个数组中。 我尝试做类似的事情,但它不起作用。
char name[20][20];
char *s[20];
char *t[20];
s = name[1];
t = name[2];
以下是声明指向 20 个元素的数组的指针的方法:
char (*ptr)[20];
所以,这就是你做你想做的事的方式:
char name[20][20];
char (*s)[20] = &name[1]; // note the &
char (*t)[20] = &name[2];
下面是您稍后访问这些数组元素的方式:
for (size_t i = 0; i < sizeof(*s); ++i) {
printf("%d ", (*s)[i]);
}
这样声明的数组
char name[20][20];
用在表达式中,例如初始化器被隐式转换为指向其第一个类型为 char ( * )[20]
.
所以你可以这样写
char ( *s )[20] = name;
在这种情况下,例如要遍历指针 s 指向的数组的字符元素,您需要使用像
这样的表达式( *s )[0], ( *s )[1], an so on
或喜欢
s[0][0], s[0][1], and so on.
如果指针声明为
,遍历指向的字符数组会更简单char *s = name[0];
char *t = name[1];
等等。
所以要么你应该像这样声明指针
char ( *s )[20] = name;
char ( *t )[20] = name + 1;
或喜欢
char *s = name[0];
char *t = name[1];
您可以通过使用指针赋值的简短练习来完善您的问题。例如从上面的评论继续,创建 myptr
作为 指针到数组 的 char[20]
和 s
和 t
到 char[20]
的数组,你可以这样做:
#include <stdio.h>
int main (void) {
const char name[20][20] = { "Mickey Mouse", "Minnie Mouse", "Pluto",
"Bugs Bunny", "Porky Pig", "Daffy Duck", "" },
(*myptr)[20] = name;
while (1) {
const char *s = *myptr++, *t = *myptr++;
if (*s)
puts (s);
else
break;
if (*t)
puts (t);
else
break;
}
}
例子Use/Output
$ ./bin/ptr2arrexercise
Mickey Mouse
Minnie Mouse
Pluto
Bugs Bunny
Porky Pig
Daffy Duck
问题:空字符串作为上面代码中name
的最后一个元素有什么用?