#include <cstdio>
struct Month {
char* s;
int d;
};
int main()
{
char* month[] = {"Jan","Feb","Mar","Apr","May",
"Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
int days[] = {31,28,31,30,31,30,31,31,30,31,30,31};
Month m[] = {{"Jan",31},{"Feb",28},{"Mar",31},{"Apr",30},
{"May",31},{"Jun",30},{"Jul",31},{"Aug",31},{"Sep",30},
{"Oct",31},{"Nov",30},{"Dec",31}};
int i;
for (i=0;i<12;++i)
printf("%2d: %s %d%s",i+1,month[i],days[i],(i+1)%4?" ":"\n");
for (i=0;i<12;++i)
printf("%2d: %s %d%s",i+1,m[i].s,m[i].d,(i+1)%4?" ":"\n");
}
|
Month の char* s は char s[4] でもいい、main の char* month[] は char month[][4] でもよい。
char* の場合、ポインタの指している先のライフスパンを気にしなければいけない。
配列は、そのままでは代入できないが、構造体のメンバにすることによって代入が可能となる。
でも実際には、char* や char配列を使うよりは string を使った方が良い。
0040100A xor ecx,ecx : ecx = 0
0040100C mov eax,400h : eax = 1024
00401011 mov dword ptr [esp],ecx : i = ecx
00401015 cmp dword ptr [esp],eax : if (i >= eax)
00401019 jge 00401032 : goto 401032
0040101B mov edx,dword ptr [esp] : edx = i
0040101F mov dword ptr [esp+edx*4+4],ecx : a[i] = 0
00401023 mov edx,dword ptr [esp] : edx = i
00401027 inc edx : --edx
00401028 mov dword ptr [esp],edx : i = edx
0040102C cmp dword ptr [esp],eax : if (i < eax)
00401030 jl 0040101B : goto 40101B
00401032 lea eax,[esp+4] : eax = a
00401036 mov dword ptr [eax],ecx : *eax = ecx
00401038 add eax,4 : ++eax
0040103B lea edx,[esp+1004h] : edx = a+n
00401042 cmp eax,edx : if (eax != edx)
00401044 jne 00401036 : goto 401036
|
コロン以降は私の注釈。
40100C 〜 401030 までが添字による代入であり、
401032 〜 401044 までがポインタによる代入である。
0040100D xor ecx,ecx : ecx = 0
0040100F mov eax,400h : eax = 1024
00401014 mov dword ptr [ebp-4],ecx : i = ecx
00401017 cmp dword ptr [ebp-4],eax : if (i >= eax)
0040101A jge 0040102F : goto 40102F
0040101C mov edx,dword ptr [ebp-4] : edx = i
0040101F mov dword ptr [ebp+edx*4-1004h],ecx : a[i] = ecx
00401026 mov edx,dword ptr [ebp-4] : edx = i
00401029 inc edx : --edx
0040102A mov dword ptr [ebp-4],edx : i = edx
0040102D jmp 00401017 : goto 401017
0040102F lea eax,[ebp-1004h] : eax = a
00401035 mov dword ptr [eax],ecx : *eax = ecx
00401037 add eax,4 : ++eax
0040103A lea edx,[ebp-4] : edx = a+n
0040103D cmp eax,edx : if (eax != edx)
0040103F jne 00401035 : goto 401035
|
40100F 〜 40102D までが添字による代入であり、
40102F 〜 40103F までがポインタによる代入である。
#include <cstdio>
void PrintMonth(char* m[])
{
for (int i=0;i<12;++i)
printf("%2d %s\n",i+1,m[i]);
}
int main()
{
char* m[] = {"Jan","Feb","Mar","Apr","May","Jun",
"Jul","Aug","Sep","Oct","Nov","Dec"};
PrintMonth(m);
}
|