1) 常量指针: 这些类型的指针是不能改变它们指向的地址的指针。这意味着假设有一个指针指向一个变量(或存储该变量的地址)。现在如果我们尝试将指针指向其他变量(或者尝试让指针存储其他变量的地址),那么常量指针就无法做到这一点。
一个常量指针被声明为:int *const ptr('const'的位置使得指针'ptr'为常量指针)
2) 指向常量的指针: 这些类型的指针不能改变它们所指向的值。这意味着他们无法更改他们持有的地址的变量的值。
指向常量的指针声明为:const int *ptr('const' 的位置使指针'ptr' 成为指向常量的指针。
示例
常量指针
#include<stdio.h>
int main(void)
{
int a[] = {10,11};
int* const ptr = a;
*ptr = 11;
printf("\n value at ptr is : [%d]\n",*ptr);
printf("\n Address pointed by ptr : [%p]\n",(unsigned int*)ptr);
ptr++;
printf("\n Address pointed by ptr : [%p]\n",(unsigned int*)ptr);
return 0;
}
现在,当我们编译上面的代码时,编译器会报错:
practice # gcc -Wall constant_pointer.c -o constant_pointer
constant_pointer.c: In function ‘main’:
constant_pointer.c:13: error: increment of read-only variable ‘ptr’
因此我们在上面非常清楚地看到编译器抱怨我们无法更改常量指针所持有的地址。
指向常量的指针
#include<stdio.h>
int main(void)
{
int a = 10;
const int* ptr = &a;
printf("\n value at ptr is : [%d]\n",*ptr);
printf("\n Address pointed by ptr : [%p]\n",(unsigned int*)ptr);
*ptr = 11;
return 0;
}
现在,当上面的代码被编译时,编译器会报错:
practice # gcc -Wall pointer_to_constant.c -o pointer_to_constant
pointer_to_constant.c: In function ‘main’:
pointer_to_constant.c:12: error: assignment of read-only location ‘*ptr’
因此在这里我们也看到编译器不允许指向常量的指针改变被指向的变量的值。
Quotation