2013年(27)
分类: C/C++
2013-12-13 13:48:28
#includeint main(void) { int a[] = {1, 2, 3, 4, 5}; int* p = a; printf("%p\n", a); printf("%p\n", &a); printf("%p\n", a+1); printf("%p\n", &a+1); return 0; }
运行结果:
结果 a+1 和 &a+1 输出不一样,这时怎么回事呢,且听我慢慢分析:
因为a表示int*,是一个int类型的指针,所以a+1偏移的是一个元素是一个int类型,既4个字节,所以0xbff7f218 + 0x4变成了0xbff7f22c。
而&a表示指向数据变量的指针(数组指针),所以&a+1偏移的一个元素是一个数组int[5]类型,既20个字节: 所以0xbff7f218 + 0x14变成了9xbff2f22c
#includeint main(void) { int a[5] = {1, 2, 3, 4, 5}; int i; int* p; for (i=0; i<5; i++) { printf("a[%d]=%d, *(a+%d)=%d\n", i, a[i], i, *(a+i)); printf("&a[%d]=%p, a+%d=%p\n", i, &a[i], i, a+i); } //以指针的方式打印元素 for (p=a; p5; p++) { printf("address:%p, value:%d\n", p, *p); } return 0; }
输出结果:
#includeint main(void) { int a[4][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12} }; int (*p)[3] = a; int i, j; //打印第一行的元素 for (i=0, j=0; j<3; j++) { printf("%d\t", *(*p+j)); } putchar('\n'); //打印第二行的元素 for (i=1, j=0; j<3; j++) { printf("%d\t", *(p[i]+j)); } putchar('\n'); //打印第三行的元素 for (i=2, j=0; j<3; j++) { printf("%d\t", (*(p+i))[j]); } putchar('\n'); //打印第四行的元素 for (i=3, j=0; j<3; j++) { printf("%d\t", *(&p[0][0]+i*3+j)); } putchar('\n'); //打印第四行的元素,变形 for (i=3, j=0; j<3; j++) { printf("%d\t", (&p[0][0])[i*3+j]); } putchar('\n'); return 0; }
运行结果: