指针测试总结(一)(一维数组)
1.取一维数组的首地址
int main()
{int arr[3] = {5,8,1}; printf("%d\n",arr);printf("%d\n",&arr);printf("%d\n",&arr[0]);printf("%d\n",&arr+0);
}
输出结果:
1096809108
1096809108
1096809108
1096809108
说明arr,&arr,&arr[0],&arr+0都可以取到arr数组或者说数组第一个元素的地址
2.取一维数组第一个元素的值
int main()
{int arr[3] = {5,8,1}; printf("%d\n",*arr);printf("%d,%d\n",arr,*(&arr));printf("%d\n",*(&arr[0]));printf("%d\n",*(&arr+0));printf("%d\n",arr[0]);//printf("%d\n",*(arr[0]));//错误,arr[0]已经取到第一个元素的值了
}
}
输出结果:
5
-295700460,-295700460
5
-295700460
5
5
5//*arr,*(&arr[0]),arr[0]都输出的arr的第一个元素,而*(&arr)和*(&arr+0)并不能取数组第一个元素的值
说明:*arr,*(&arr[0]),arr[0]都输出的arr的第一个元素,而*(&arr)和*(&arr+0)并不能取数组第一个元素的值
3.取一维数组第二个元素的地址
int main()
{int arr[3] = {5,8,1}; printf("%d %d\n",arr,arr+1);printf("%d\n",&arr+1);printf("%d\n",&arr[1]);
}
输出结果:
1696594580 1696594584
1696594592 //
1696594584
说明arr+1,&arr[1]可以取到数组第二个元素的地址,而使用&arr+1并不能代表数组第二个元素的地址
4.取一维数组第二个元素的值
int main()
{int arr[3] = {5,8,1}; printf("%d\n",*(arr+1));printf("%d\n",*(&arr+1));printf("%d\n",*(&arr[1]));printf("%d\n",arr[1]);
}
输出结果:
8
1654651952
8
8
说明*(arr+1),*(&arr[1]),arr[1]可以取到数组第二个元素的值,而使用*(&arr+1)并不能取到数组第二个元素的值
1. *arr,*(&arr[0])都输出的arr的第一个元素,而*(&arr)和*(&arr+0)并不能取数组第一个元素的值
2. arr,&arr,&arr[0],&arr+0都可以取到arr数组或者说数组第一个元素的地址
3. arr+1,&arr[1]可以取到数组第二个元素的地址,而使用&arr+1并不能代表数组第二个元素的地址
4. *(arr+1),*(&arr[1])可以代表数组第二个元素,而使用*(&arr+1)并不能代表数组第二个元素
总结:
取第一个元素的值和地址可以分别使用*arr,*(&arr[0])和arr,&arr,&arr[0],&arr+0
取第二个元素的值和地址可以使用和(arr+1),*(&arr[1])和arr+1,&arr[1]
总之,为避免出错,
取第一个元素的值和地址可以分别使用*arr,arr[0],*(&arr[0])和arr,&arr[0]
取第n+1个元素的值和地址可以分别使用*(arr+n),*(&arr[n])和arr+n,&arr[1]
尝试定义指针来代表这四个值:
1.取一维数组第一个元素的地址
int main()
{int arr[3] = {5,8,1}; int*p = arr;printf("%d\n",p);printf("%d\n",&p);printf("%d\n",&p[0]);printf("%d\n",&p+0);printf("%d\n",p+0);
}
输出结果:
1883241956
1883241944
1883241956
1883241944
1883241956
说明p,&p[0],p+0可以取到数组第一个元素的地址;&p,&p+0不可以
2.取一维数组的首元素的值
int main()
{int arr[3] = {5,8,1}; int*p = arr;printf("%d\n",*p);printf("%d\n",*(&p));printf("%d\n",p[0]);printf("%d\n",*(p+0));
}
输出结果
5
-813695980
5
5
说明:*p,p[0],*(p+0)都可以用来表示第一个元素的值,而*(&p)不可以
3.取一维数组第二个元素的地址
int main()
{int arr[3] = {5,8,1}; int*p = arr;printf("%d\n",&p[1]);printf("%d\n",&p+1);printf("%d\n",p+1);
}
输出结果:
-788530008
-788530016
-788530008
说明&p[1],p+1可以取到数组第二个元素的地址;而&p+1不可以
4.取一维数组第二个元素的值
int main()
{int arr[3] = {5,8,1};int*p = arr;printf("%d\n",*(p+1));printf("%d\n",*(&p+1));printf("%d\n",*(&p[1]));printf("%d\n",p[1]);
}
输出结果:
8
0
8
8
说明*(p+1), *(&p[1]),p[1]都可以表示第二个元素的值,而*(&p+1)不可以
总结:&arr,&p,&arr+n,&p+n不能单独使用,必须使用&arr[n],&p[n]规范化:1. 引用数组第一个元素地址:arr或者&arr[0]; p或者p+0或者&p[0]2. 引用数组第一个元素值:*arr,arr[0]或者*(&arr[0]); *p或者*(p+0)或者p[0]3. 引用数组第二个元素地址:arr+1或者&arr[1]; p+1或者&p[1]4. 引用数组第二个元素值:*(arr+1),arr[1]*(&arr[1]); *(p+1),p[1]或者*(&p[1])