我正在阅读C ++入门书,完全不理解一行:
using int_array = int[4];
typedef int int_array[4]; // This line
for (int_array *p = ia; p != ia + 3; ++p) {
for (int *q = *p; q != *p + 4; ++q)
cout << *q << ' '; cout << endl;
}
好typedef
与using
相同。这是int[4][4]
现在是int
还是如何理解? int_array
循环中for
的类型是什么?
谢谢
答案 0 :(得分:7)
两者都做了完全相同的事情:将int_array
定义为4 ints
using
有一个很好的A = B符号,通常更容易理解。
using alias = type;
typedef
的符号并不是很落后。对于简单的typedef
typedef type alias;
但更复杂的typedef
往往会蔓延。我怀疑语法是根据人们如何定义一个变量建模的,但我无法找到我打包旧K&amp; R C编程书的副本,目前无法查看。
int int_array[4];
将int_array
定义为4个int
的数组。在正面拍打typedef
typedef int int_array[4];
使int_array
成为类型别名而非变量。
另一个例子,
int * intp;
将intp
定义为指向int
的指针。
typedef int * intp;
将intp
定义为指向int
的类型指针的别名。
由于typedef
ed别名的名称可能隐藏在定义的中间位置,因此对于更复杂的数据类型会变得很难看。一个typedef
ed函数指针,例如:
typedef void (*funcp)(param_t param1, param_t param2, ...);
vs使用
using funcp = void (*)(param_t param1, param_t param2, ...);
如果你想要2D阵列,你可以
using int_array2D = int[4][4];
或者你可以定义一个int_array
数组using int_array2D = int_array[4];
当然这意味着你可以
using int_array3D = int_array2D[4];
继续前进,直到奶牛回家,或者你已经挤满了The Doctor大脑融化的那么多维度。
答案 1 :(得分:1)
行
using int_array = int[4];
和
typedef int int_array[4];
做同样的事情。请参阅using和typedef的参考。你可以把一个或另一个留下来,行为是一样的。拥有两个不同的声明并不是错误,因为它们没有冲突(它们完全相同)。
第一种方法(使用using
关键字)是在C ++ 11中引入的,在我看来更容易阅读,所以我更喜欢它而不是typedef版本。
答案 2 :(得分:1)
两种类型的别名都是相同的:
Type alias, alias template (since C++11):
类型别名是一个引用先前定义的类型的名称(类似于typedef):
using identifier attr(optional) = type-id ;
所以你可以使用:
typedef int int_array[4];
或者您可以使用(与上面相同):
using int_array = int[4];
当您需要使用4*sizeof(int)
步骤寻址内存时,例如如果系统int
大小为4个字节,则内存步长为4 * 4 = 16个字节。即使您可以在这种情况下使用int_array *p;
++p
前进p
一个内存步骤,例如16个字节。
见:
1- using int_array = int[4];
的工作样本:
#include <iostream>
using std::cout; using std::endl;
int main()
{
int ia[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
// a range for to manage the iteration
// use type alias
using int_array = int[4];
for (int_array& p : ia)
for (int q : p)
cout << q << " ";
cout << endl;
// ordinary for loop using subscripts
for (size_t i = 0; i != 3; ++i)
for (size_t j = 0; j != 4; ++j)
cout << ia[i][j] << " ";
cout << endl;
// using pointers.
// use type alias
for (int_array* p = ia; p != ia + 3; ++p)
for (int *q = *p; q != *p + 4; ++q)
cout << *q << " ";
cout << endl;
return 0;
}
输出1:
0 1 2 3 4 5 6 7 8 9 10 11
0 1 2 3 4 5 6 7 8 9 10 11
0 1 2 3 4 5 6 7 8 9 10 11
使用typedef int int_array[4];
的工作样本:
#include <iostream>
using std::cout; using std::endl;
int main()
{
int ia[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
// a range for to manage the iteration
// use type alias
typedef int int_array[4];
for (int_array& p : ia)
for (int q : p)
cout << q << " ";
cout << endl;
// ordinary for loop using subscripts
for (size_t i = 0; i != 3; ++i)
for (size_t j = 0; j != 4; ++j)
cout << ia[i][j] << " ";
cout << endl;
// using pointers.
// use type alias
for (int_array* p = ia; p != ia + 3; ++p)
for (int *q = *p; q != *p + 4; ++q)
cout << *q << " ";
cout << endl;
return 0;
}
输出2(相同):
0 1 2 3 4 5 6 7 8 9 10 11
0 1 2 3 4 5 6 7 8 9 10 11
0 1 2 3 4 5 6 7 8 9 10 11
参考:https://github.com/Mooophy/Cpp-Primer/blob/master/ch03/ex3_44.cpp
注意:使用-std=c++11
进行编译/链接。
3-仅用于演示(摘录):
嵌入式系统中的一些实际应用:
extern const char kpd2ascii[6][6] PROGMEM;
typedef const char cint8a6_t[6];
cint8a6_t *p;
p = kpd2ascii;
kpdBuffer = pgm_read_byte(&p[row][col - 1]);
我希望这会有所帮助。