指针小记

96 阅读1分钟

指针与数组名

数组名与指针变量的区别

int main()  
{  
/*看 pa = a,即 数组名赋值给指针,以及通过数组名、指针对元素的访问形  
式看,它们并没有什么区别,从这里可以看出:数组名其实也就是指针*/  
int i, *p, a[] = {3,4,5,6,7,3,7,4,4,6};  
p = a;  
for (int i = 0; i < 10; ++i) {  
    printf("%d", *(p + i));  
}  
printf("\n");  
for (int i = 0; i < 10; ++i) {  
    printf("%d", p[i]);  
}  
    return 0;  
}

难道他们之间没有区别吗?答案是否定的。看下面代码:

#include <stdio.h>  
int main()  
{  
int i, *pa, a[] = {3,4,5,6,7,3,7,4,4,6};  
pa = a;  
for (int i = 0; i < 10; ++i) {  
    printf("%d", *pa);  
pa++; /*注意这里,指针值被修改*/  
}  
    return 0;  
}

但如果将pa改成a,就会报错,看来指针和数组名还是不同的。 其实上面的指针是指针变量,而 数组名只是一个指针常量。这个代码与上面的代 码不同的是,指针 pa 在整个循环中,其值是不断递增的,即指针值被修改了。 数组名是指针常量,其值是不能修改的,因此不能类似这样操作:a++。

声明指针常量

再请看下面的代码:

int i, a[] = {3,4,5,6,7,3,7,4,4,6};
int *const pa = a; /* 注意 const 的位置:不是 const int *pa */
for (i = 0; i <= 9; i++)
{
    printf("%d\n", *pa);
    pa++ ; /*注意这里,指针值被修改*/
}

这时候的代码能成功编译吗?不能。因为 pa 指针被定义为常量指针了。这 时与数组名 a 已经没有不同。这更说明了数组名就是常量指针。 但是……

int *const a = {3,4,5,6,7,3,7,4,4,6}; /*不行*/
int a[]={3,4,5,6,7,3,7,4,4,6}; /*可以,所以初始化数组时必定要这样。*/