指向元素的指针和指向数组的指针,行级指针
- 这俩概念还是很不一样,请君明鉴
#include<stdio.h> #include<stdlib.h> #include<time.h> void main() { //指向元素的指针和指向数组的指针 int b[10] = {1,2,3,4,5,6,7,8,10}; int *p = b;//代表指向数组首元素地址的指针!!! int(*q)[10] = &b;//代表指向数组的指针!!! printf("指向数组首元素地址的指针,代表的内存大小%d\n",sizeof(*p)); printf("指向数组的指针,代表的内存大小%d\n", sizeof(*(q))); getchar(); }
- 对于一个二维数组,指针的含义
#include<stdio.h> #include<stdlib.h> #include<time.h> void main() { int a[3][4] = { { 9, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } }; printf("a的地址:%p 其指向的数据大小%d\n",a,sizeof(*(a))); printf("&a的地址:%p 其指向的数据大小%d\n", &a, sizeof(*(&a))); printf("*a的地址:%p 其指向的数据大小%d\n", *a, sizeof(**a)); getchar(); }
尽管内存大小都一样,但是从取地址操作来看,a为指向一行的指针,&a代表指向整个二维数组的指针,*a代表a指向的那一行的首元素的地址
- 行指针的表示方法
#include<stdio.h> #include<stdlib.h> #include<time.h> void main() { //printf(); int a[3][4] = {66, 2, 3, 4 , 5, 6, 7, 8 ,9, 10, 11, 12 }; //*(a + 1) printf("a代表行指针,指向一行,取出这个行地址操作*a,可知,这个行包含了4个整型元素。大小为%d\n", sizeof(*a)); printf("&a代表指针指向整个二维数组,通过取地址操作*&a可知,二维数组大小%d\n", sizeof(*&a)); printf("*a代表指针指向行的首元素,通过取地址操作**a可知,这个元素大小%d,其值为%d\n", sizeof(**a),**a); getchar(); }
#include<stdio.h> #include<stdlib.h> #include<time.h> void main() { int a[3][4] = { { 66, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } }; printf("(*a+2)表示第一行第三个元素的地址,不信?那咱试试%d\n",*(*a+2)); printf("*(a+2)的大小%d,a[2]的大小%d\n",sizeof(**(a+2)),sizeof(*a[2]));//说明他们同为列指针 printf("a+2的大小为%d\n",sizeof(*(a+2)));//说明a+2是行指针 getchar(); }
由此可见a+2是行指针指向第三行