/* 編譯: gcc -Wall address.c */ #include int main(int argc, char *argv[]) { double x, y, z; double *p; x = 1.2; y = 2.4; z = 4.8; p = & y; /* 底下的 "%-..." 表示將資料印在給定的欄位左邊 */ printf("%-8s %-16s %-8s %-16s\n", "name", "address", "size", "content"); printf("%-8s %-16p %-8d %-16g\n", "x", &x, sizeof(x), x); printf("%-8s %-16p %-8d %-16g\n", "y", &y, sizeof(y), y); printf("%-8s %-16p %-8d %-16g\n", "z", &z, sizeof(y), z); printf("%-8s %-16p %-8d %-16p %-8g\n", "p", &p, sizeof(p), p, *p); p += 1; printf("\nafter p += 1:\n\n"); printf("%-8s %-16p %-8d %-16g\n", "x", &x, sizeof(x), x); printf("%-8s %-16p %-8d %-16g\n", "y", &y, sizeof(y), y); printf("%-8s %-16p %-8d %-16g\n", "z", &z, sizeof(y), z); printf("%-8s %-16p %-8d %-16p %-8g\n", "p", &p, sizeof(p), p, *p); *p += 1; printf("\nafter *p += 1:\n\n"); printf("%-8s %-16p %-8d %-16g\n", "x", &x, sizeof(x), x); printf("%-8s %-16p %-8d %-16g\n", "y", &y, sizeof(y), y); printf("%-8s %-16p %-8d %-16g\n", "z", &z, sizeof(y), z); printf("%-8s %-16p %-8d %-16p %-8g\n", "p", &p, sizeof(p), p, *p); return 0; } /* 注意 "%..." 當中指定的型別, 必須與後面對應參數的型別一致. 作業 1: 試著在 "%..." 當中指定錯誤的型別, 看看會有什麼錯誤訊息. (編譯時要記得加 -Wall, 否則會遺漏一些錯誤訊息.) 作業 2: 仿此例, 印出以下變數的相關資訊 (對於指標變數, 要記得先 隨便給一個有意義的初始值.) double a, b, c, *d, *e, *f, **g; 然後依序做 g += 1; *g += 1; **g += 1; 每做一步就把所有變數的資訊重印一次. 不要急著執行. 先確定編譯都沒有問題, 並且自己先猜想答案, 最後才執行程式. 作業 3: 對命令列上傳進來的 *argv[] 做同樣的事: 印出 argv, argv[0], argv[1],... 的資訊. 分別執行以下片斷, 所有變數的資訊會有何改變? (這題稍複雜, 一次試一種就好, 不要串起來執行.) ++argv; ++*argv; ++argv[1]; ++*(argv[1]); ++(*argv)[1]; ++argv[1][2]; 那一句的效果與 ++*argv[1]; 一樣? */