私はC++の入門書を読んでいますが、1行完全に理解していません。
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
になったことと、それを理解する方法を意味しますか? for
ループのint_array
はどのタイプですか?
ありがとう
両方ともまったく同じことをしています:int_array
を4の配列のエイリアスとして定義ints
using
には、一般に理解しやすいニースA = B表記があります。
using alias = type;
typedef
の表記法はまったく逆ではありません。単純なtypedef
の場合
typedef type alias;
しかし、より複雑なtypedef
sはスプロールする傾向があります。シンタックスは変数の定義方法をモデルにしたものと思われますが、古いK&R Cプログラミング本のコピーをどこに詰め込んでいるかはわかりませんし、現時点では調べられません。
int int_array[4];
int_array
を4つのint
sの配列として定義します。前面の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, ...);
対使用
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 の脳が溶けるまで続けます。
両方のタイプエイリアスは同じです。
タイプエイリアス、エイリアステンプレート(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
を1メモリステップ進めます。 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
2- 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]);
これがお役に立てば幸いです。