C指针问题(指向常量的指针)

来源:百度知道 编辑:UC知道 时间:2024/05/22 08:47:09
大家知道指针(假设是char型的指针)可以指到一个不可修改的单元,只要定义成const char *p;的形式就可以。
下面的程序应该是错误的:
#include "stdio.h"
main()
{
char string[4]="abc";
const char *p=&string[0]; //p指的是不可改变的单元
string[0]='x'; //string[0]的内容改变
puts(string);
}
这个程序运行结果是xbc
说明string[0]这个字符改变了,但是指针p是指向不可改变的单元,这个单元就是&string[0],我们应该不能改写string[0],可是结果显示却改变了,这是为什么?
一楼的回答不清楚:我当然知道*p='x';是非法的,不能通过指针p来改变它指向的内存单元的值。问题是既然p是指向不可改变的单元而这个单元就是string[0],那么string[0]当然也就不能改变了。我就想知道为什么上面程序却显示改变了?
二楼的回答根本不正确。
那按照三楼的说法,我们用const限制指针有什么意义呢?const对变量的保护作用哪去了?

const char *p=&string[0];
该定义的意思是,不能通过指针p来改变它指向的内存单元的值
也就是说,
语句 *p='x';编译时会出现错误,
而像你程序中的语句是允许的

一楼的回答不清楚:我当然知道*p='x';是非法的,不能通过指针p来改变它指向的内存单元的值。
/***问题是既然p是指向不可改变的单元而这个单元就是string[0],那么string[0]当然也就不能改变了。**/

不是不能改变,而是不能通过这个指针改变。

那按照三楼的说法,我们用const限制指针有什么意义呢?const对变量的保护作用哪去了

你要是真想把它搞成谁都不能变,可以 这样声明const char string[4]="abc"; 要是这样它还能被改你砸我

我感觉 用了const char *p=&string[0]; 只是说指针p的值不能改变了 而这个指针指向的值 是可以改变的 就是说&string[0]是不能改变了 而string[0]是可以改变的

你所指的不可改变是string[0]的地址是不可改变的 而里面的值的可以改变的啊 !你对指针的理解有问题 指针就是地址 而你改变的是地址里面的值 存放在地址里面的内容 不知道我解释清楚没有

void f(const int *val)
{
int *p;
p=const_cast<int *>(val);
*p=*val * *val;
{
val同样被定义成const型的
但结果还是被改变了
我也不知到是什么原因