1 const修饰变量;
* 在C语言中const修饰的变量是只读的,其本质还是变量,所以可以使用指针将其变量的值改变。
* const修饰的变量会在内存占用空间
* 本质上const只对编译器有用,在运行时无用
实例:
int main(int argc, char *argv[])
{
const int va=10;
printf("va = %d\n",va);
int* p=&va;
*p=100;
printf("new va =%d\n",va);
return 0;
}
运行结果:
va=10;
new va=100;
2 const修饰数组
* 在C语言中const修饰的数组是只读的
* const修饰的数组空间不可被改变
实例:
int main(int argc, char *argv[])
{
const int array[]={1,2,3,4,5,6};
int *p=array;
for(int i=0;i<5;i++)
p[i]=5-i;
for(int j=0;j<5;j++)
printf("new array =%d\n",array[j]);
return 0;
}
输出:5 4 3 2 1
3 const修饰的指针
* const int* p; //p可变,p指向的内容不可变
* int const* p; //p可变,p指向的内容不可变
* int*const p; //p不可变,p指向的内容可变
* const int*const p; //p和p指向的内容都不可变
口诀:左数右指---->当const出现在*的左边,则指针指向的数据不可以被改变,当const出现在*的右边,则指针指本身不可改变,(即指针指向的地址不可以被改变);
实例:
T1 const int* p;
int main(int argc, char *argv[])
{
int v_a=10;
int v_b=100;
const int *p=&v_a;
*p=100;
printf("v_a=%d\n",v_a);
return 0;
}
这里试图用*p改变p所指向地址的值,则编译无法通过;
int main(int argc, char *argv[])
{
int v_a=10;
int v_b=100;
const int *p=&v_a;
printf("*p=%d\n",*p);
p=&v_b;
printf("*p=%d\n",*p);
return 0;
}
这里先将const修饰的指针指向v_a,然后又将const修饰的指针指向v_b合法,输出*p=10,*p=100;
T2 int const* p 其功能和const int *p一样;
实例:
int main(int argc, char *argv[])
{
int v_a=10;
int v_b=100;
int const *p=&v_a;
printf("*p=%d\n",*p);
p=&v_b;
printf("*p=%d\n",*p);
return 0;
}
这里先将const修饰的指针指向v_a,然后又将const修饰的指针指向v_b合法,输出*p=10,*p=100;
int main(int argc, char *argv[])
{
int v_a=10;
int v_b=100;
int const *p=&v_a;
printf("*p=%d\n",*p);
*p=100;
return 0;
}
这里试图用*p改变p所指向地址的值,则编译无法通过;
T3 int*const p,const在*的右边,所以本身(指向的地址不可以被改变),但其指向的值可以改变
实例:
int main(int argc, char *argv[])
{
int v_a=10;
int v_b=100;
int* const p=&v_a;
// printf("*p=%d\n",*p);
*p=100;
printf("*p=%d\n",*p);
return 0;
}
指向先指向v_a=10,后面改变了指针指向地址的值为100,是合法的;输出100;
实例:
int main(int argc, char *argv[])
{
int v_a=10;
int v_b=100;
int* const p=&v_a;
printf("*p=%d\n",*p);
p=&v_b;
printf("*p=%d\n",*p);
return 0;
}
这里试图改变指针指向的地址,编译器无法通过;
T4
const int*const p; //p和p指向的内容都不可变
实例:
int main(int argc, char *argv[])
{
int v_a=10;
int v_b=100;
const int* const p=&v_a;
printf("*p=%d\n",*p);
*p=v_b;
return 0;
}
试图修改p指向的地址的值不合法,编译器不通过。
试图改变p指向的地址,不合法,编译器直接不通过。int main(int argc, char *argv[]) { int v_a=10; int v_b=100; const int* const p=&v_a; printf("*p=%d\n",*p); p=&v_b; return 0; }
4 const修饰函数参数和返回值
*const修饰函数参数表示在函数体内不希望改变参数的值
*const修饰函数返回值表示返回值不可改变,多用于返回指针的情形