一个C++的例子,关于指针,课件上的表述:
不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的对象。
例1
char *name1 = "John"; //name1是一般指针
*name1='A'; //编译正确,运行出错
例2
const char *name1 = "John"; //指向常量的指针
char s[]="abc";
name1=s; //正确,name1本身的值可以改变
*name1='1'; //编译时指出错误
课件上说*name1='A'是错误的,只能通过修改指针指向的对象来改变指针指向的值,实际上这个说法是错误的,见下例:
不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的对象。
#include <iostream.h>
int m; float k;
void splitfloat(float a, int *intpart, float *fracpart)
{ //形参intpart、 fracpart是指针
m=(int)a;
*intpart=m;
k=a-(int)a;
// 取x的整数部分
*fracpart=k; //取x的小数部分
}
int main()
{
int i, n;
// float k;
float x,f;
// int i=(8&3);
// cout<<i<<endl;
for (i = 0; i < 3; i++)
{
cin >> x;
splitfloat(x,&n,&f); //变量地址做实参
// cout <<"Integer Part is "<<n<< "Fraction Part is <<f<< endl;
cout<<n<<" "<<f<<endl;
}
return 0;
}
输入1.56,可以分别输出整数部分和小数部分
我又按照课件的逻辑修改了程序,将程序改为。
#include <iostream.h>
int m; float k;
void splitfloat(float a, int *intpart, float *fracpart)
{ //形参intpart、 fracpart是指针
m=(int)a;
intpart=&m;
k=a-(int)a;
// 取x的整数部分
fracpart=&k; //取x的小数部分
}
int main()
{
int i, n;
// float k;
float x,f;
// int i=(8&3);
// cout<<i<<endl;
for (i = 0; i < 3; i++)
{
cin >> x;
splitfloat(x,&n,&f); //变量地址做实参
// cout <<"Integer Part is "<<n<< "Fraction Part is <<f<< endl;
cout<<n<<" "<<f<<endl;
}
return 0;
}
输入1.56,输出的是两个极小的负数,我分析了出现这个问题的原因,不能通过修改常量的内存地址来修改常量的值,这是因为常量不存在取值符号*的操作。