为什么char型指针可以直接赋值而其他类型的不行呢?个人见解
2012-07-26 20:08
423 查看
问题陈述:
通常大家会遇到这样的问题:
char * p = "abc";可以顺利执行,而int *a = 1;确运行不了(这里指运行环境是VC,GCC竟然可以成功执行,这里我也比较迷惑)。
问题探讨:
这里都是我的个人看法:
int *a = 1;
这句话的代码从人类语言的理解上,就是给一个指针赋值并指向一个值为1的地址。但是编译器它不是人,它只知道char型的指针可以直接“赋值”,而int型的指针如果“赋值”怎么做呢?通常有两种做法:
方法一:
int j = 1;
int &r = j;
那么r中的值就为1,但是这里的r却不是我们想要的指针变量。
如果说一定要给int型指针变量赋值,我们采用:
方法二:
int i = 1;
int * a = &i;
的话,结果却是i的内存地址。怎么回事呢?在解决问题之前,我先举个例子:
我们定义为:
char *aa="abc";
char *bb="abc";
aa与bb相等吗?
和char aaa[]="abc";
char bbb[]="abc";
aaa与bbb相等吗?
这个问题的思考就能很好地理解这里的指针“赋值”问题了。
上述例子的结果是:aa == bb true ; aaa==bbb false
这个结果从两个角度解释,
角度一(
静态存储区和栈):
char *aa="abc";
char *bb="abc";
系统把 "123" 放在了静态存储区里,栈里放了 aa 这个指针变量,指向了 "123"这个地址。
char aaa[] = "123";
char bbb[] = "123";
是系统在栈里面放了两个字符数组变量,互相无任何关联,因此它的aaa与bbb不会相等。
角度二(指针内容和地址):
aa和bb存的都是相同的指针地址。
aaa和bbb虽然都是 "abc",但地址不一样。
问题总结:
既然这个问题能够理解清楚,那么从这两个角度来说,给指针一个内容那么就不能跟我们传统意义上的“赋值”相提并论。因为对于问题中int *a = 1;来说这个1 是整型数据不能放入静态存储区。而从内容和地址来说,如果像上述两种赋值方式得到的只能是内存的地址,而不是内容。
通常大家会遇到这样的问题:
char * p = "abc";可以顺利执行,而int *a = 1;确运行不了(这里指运行环境是VC,GCC竟然可以成功执行,这里我也比较迷惑)。
问题探讨:
这里都是我的个人看法:
int *a = 1;
这句话的代码从人类语言的理解上,就是给一个指针赋值并指向一个值为1的地址。但是编译器它不是人,它只知道char型的指针可以直接“赋值”,而int型的指针如果“赋值”怎么做呢?通常有两种做法:
方法一:
int j = 1;
int &r = j;
那么r中的值就为1,但是这里的r却不是我们想要的指针变量。
如果说一定要给int型指针变量赋值,我们采用:
方法二:
int i = 1;
int * a = &i;
的话,结果却是i的内存地址。怎么回事呢?在解决问题之前,我先举个例子:
我们定义为:
char *aa="abc";
char *bb="abc";
aa与bb相等吗?
和char aaa[]="abc";
char bbb[]="abc";
aaa与bbb相等吗?
这个问题的思考就能很好地理解这里的指针“赋值”问题了。
上述例子的结果是:aa == bb true ; aaa==bbb false
这个结果从两个角度解释,
角度一(
静态存储区和栈):
char *aa="abc";
char *bb="abc";
系统把 "123" 放在了静态存储区里,栈里放了 aa 这个指针变量,指向了 "123"这个地址。
char aaa[] = "123";
char bbb[] = "123";
是系统在栈里面放了两个字符数组变量,互相无任何关联,因此它的aaa与bbb不会相等。
角度二(指针内容和地址):
aa和bb存的都是相同的指针地址。
aaa和bbb虽然都是 "abc",但地址不一样。
问题总结:
既然这个问题能够理解清楚,那么从这两个角度来说,给指针一个内容那么就不能跟我们传统意义上的“赋值”相提并论。因为对于问题中int *a = 1;来说这个1 是整型数据不能放入静态存储区。而从内容和地址来说,如果像上述两种赋值方式得到的只能是内存的地址,而不是内容。
相关文章推荐
- 为什么char型指针可以直接赋值而其他类型的不行呢?个人见解
- 为什么父类指针可以指向子类反之则不行
- 二维数组和二重指针 的疑问 二维数组名为什么不能直接赋值给二重指针
- 数组与字符串、字符指针与其他类型指针、赋值参数、指针参数以及引用参数、函数指针
- 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?
- 类型自动转换引起的误解——QString可以赋值数字1,也能直接与0比较,真是昏倒!
- 为什么父类指针可以指向子类反之则不行
- 为什么基类指针和引用可以指向派生类对象,但是反过来不行?
- 为什么static成员的类型可以是类本身?又为什么非static成员被限定声明为其自身类对象的指针或引用?
- 类对象可以直接赋值,但数据成员包含指针时 慎重
- 为什么父类指针可以指向子类反之则不行(内存长度不同)
- C 不可以直接对指针进行赋值!!!
- 指针二维二维数组和二重指针 的疑问 二维数组名为什么不能直接赋值给二重指针
- 为什么其他类没继承System类 ,也可以直接使用System.exit()方法??
- Oracle中Clob类型处理解析(NHibernate long值绑定long列,或者是直接oraclecommand的插入的时候报错都能用,ORA-01461:仅可以插入LONG列的LONG值赋值
- 为什么基类指针和引用可以指向派生类对象,但是反过来不行?
- 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?
- 为什么父类指针可以指向子类反之则不行
- C语言_为什么字符串可以赋值给字符指针变量,字符串的属性及存放位置