int a = 98;
int *p = &a;
p
:表示指针变量名,存放的是地址;*p
:取指针变量指向的内存空间的数据;p+1
:向后偏移一个int类型
大小的空间;*(p+1)
:取p+1指向
的内存空间的数据;- 一维数组名的含义:
int array[5] = {11,22,33,44,55};
array
:表示数组的名字,同时也是数组的首地址
;array[1]
:取数组第一个元素
的值
(特别注意:
数组的下标是从0开始
的),等价于*(array+1)
;&array[1]
:取数组第一个元素
的地址
,等价于array+1
;- 两者的区别:
- 可以通过一级指针指向一维数组,比如:在给函数传递一个数组时,可以使用一级指针指向一个一维数组;
- 一级指针变量名
不完全等价于
一维数组名; - 一级指针变量名是
一个变量
,可以被修改; - 一维数组名字是
一个常量
,不可以被修改; - 代码如下:
#include<stdio.h>
void print_array(int a[],int len){
for(int i = 0; i < 5; i++){
printf("*(a + %d) = %d\n",i,*(a + i));
}
putchar('\n');
}
void show_array(int *q,int len){
for(int j = 0; j < 5; j++){
printf("q[%d] = %d\n",j,q[j]);
}
putchar('\n');
}
int main(int argc, const char *argv[])
{
int array[5] = {11,22,33,44,55};
int *p = array;
for(int i = 0; i < 5; i++){
printf("*(p + %d) = %d\n",i,*(p+i));
}
putchar('\n');
printf("array = %p\n",array);
printf("p = %p\n",p);
putchar('\n');
printf("array + 4 = %p\n",array + 4);
printf("p + 4 = %p\n",p + 4);
putchar('\n');
printf("*(array + 3) = %d\n",*(array + 3));
printf("*(p + 3) = %d\n",*(p + 3));
printf("array[3] = %d\n",array[3]);
putchar('\n');
for(int i = 0; i < 5; i++){
printf("array[%d] = %d\n",i,array[i]);
}
putchar('\n');
print_array(p,5);
show_array(array,5);
for(int i = 0; i < 5; i++){
printf("%d\n",*(p++));
}
putchar('\n');
for(int i = 0; i < 5; i++){
printf("*(p + %d) = %d\n",i,*(p+i));
}
putchar('\n');
for(int i = 0; i < 5; i++){
printf("%d\n",*(--p));
}
return 0;
}
*(p + 0) = 11
*(p + 1) = 22
*(p + 2) = 33
*(p + 3) = 44
*(p + 4) = 55
array = 0x7fffe3fadfb0
p = 0x7fffe3fadfb0
array + 4 = 0x7fffe3fadfc0
p + 4 = 0x7fffe3fadfc0
*(array + 3) = 44
*(p + 3) = 44
array[3] = 44
array[0] = 11
array[1] = 22
array[2] = 33
array[3] = 44
array[4] = 55
*(a + 0) = 11
*(a + 1) = 22
*(a + 2) = 33
*(a + 3) = 44
*(a + 4) = 55
q[0] = 11
q[1] = 22
q[2] = 33
q[3] = 44
q[4] = 55
11
22
33
44
55
*(p + 0) = 32767
*(p + 1) = 847337984
*(p + 2) = 1376258227
*(p + 3) = 1273121360
*(p + 4) = 21986
55
44
33
22
11