看了巨人网络招聘题目,感觉到自己的基础知识还是不够行。乡亲们,有病的治病,没病的也可强身健体。
#include <stdio.h>
#include<malloc.h>
#include<string.h>
void GetMemory( char *p )
{
p = (char *) malloc( 100 );
}
void main( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf( str );
}
问运行结果。。。
一开始没能明白什么意思,经过一番的探索,才渐渐。。。。。道声,,哦。、
其实我压根就没明白char *指针的真正含义,原来是这样的。
例:
char *s="abc";
char str[]="abccd";
1、char *s="abc";
看这个赋值:
右边,是"abc",是个字符串常量,存在于内存某处(我的机器上是ds:0x0046f034),程序员不知道,编译器安排的,也没必要知道(当然,这个赋值之后,程序员就知道并能控制这个串了)。字符串常量所在内存是只读的。
左边,字符指针s,赋值时候,把地址ds:0x0046f034的偏移地址("abc"所在),存放到指针变量s(其地址为 ds:0x0046f034)中。程序员能完全控制的内存只是指针变量所占据的这四个字节内存,只能改变该指针的指向,至于其指向的内存能不能写,那就看程序了,本程序是指向的只读内存,不能写!
2、char str[]="abccd";
再看这个赋值:
右边,和上面类似,是"abccd",也是个字符串常量,存在于内存某处(是ds:0x0046f02c),程序员不知道,编译器安排的(这个赋值之后,程序员还是不知道这个常量在哪里,因为并没有用指针指向这块内存,这和上面不同)。该字符串常量所在内存也是只读的。
左边,字符数组str,赋值时候,把地址ds:0x0046f02c("abccd"所在)所指内存中的内容,复制到字符数组str开始(其地址为 ds:0x0013ff74)的内存中,每复制一个字符都会开辟一个字节(char型变量占1字节)内存来存放这个字符(这也是实现了数组元素个数的动态确定)。从字符数组str开始的这部分存放这些字符的内存是程序员可以完全控制的,可读写,因此在这些内存写当然是没有问题的!
到这里,突然想到多年前看过的一本书《C和指针》(Kenneth A. Reek著,徐波 译,现在有第二版了¥65,第一版¥55,不便宜,但是是好书,值得研读,是研读哦,不是翻翻,当然翻翻也会有收获的)里面好像提到过这个问题,赶快拿来看看(字符数组的初始化一节),果然这样。
许多程序员对数组名和指针的区别不甚明了,他们认为数组名就是指针,而实际上数组名和指针有很大区别,在使用时要进行正确区分,其区分规则如下:
规则1 数组名指代一种数据结构,这种数据结构就是数组;
char str[10];
char *pStr = str;
cout << sizeof(str) << endl;
cout << sizeof(pStr) << endl;
输出结果为:
10
4
这说明数组名str指代数据结构char[10]。
规则2 数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改;
char str[10];
char *pStr = str;
str++; //编译出错,提示str不是左值
pStr++; //编译正确
规则3 指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址;
规则4 数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
例如:
void arrayTest(char str[])
{
cout << sizeof(str) << endl; //输出指针长度
str++; //编译正确
}
int main(int argc, char* argv[])
{
char str1[10] = "I Love U";
arrayTest(str1);
return 0;
}
分享到:
相关推荐
一个实例引发的思考.ppt(sql2000) sql200的应用的一个实例详细的分析
2015 Oracle 技术嘉年华(OTN)分会场12乔晓阳 - 一个直方图问题引发的思考
从食品安全问题引发的思考.doc
近年食品安全问题引起的思考.doc
幼儿园食品安全问题引起的思考.docx
对非典所引发法律问题的思考.docx
食品安全问题引起的思考和建议.doc
运营商系统运维人员使用drop分区进行历史数据清理引起了一次性能问题,本文对此进行了具体的分析和思考。
有一个案例引发的思考--诈骗罪和盗窃罪的区别.docx
《像程序员一样思考》选取的话题切中程序员的痛点,针对他们最容易陷入挣扎的领域展开讨论,引发思考。每章后面都给出一些编程习题,使得读者能够应用该章所讨论的概念,训练和提升问题解决的能力。 《像程序员一样...
测量结果准确性依赖于正确的方法和精密的仪器,有时隐藏在电源插座中的发光二极管也会带来意想不到的测量误差。
食品安全问题引发对幼儿道德教育的思考.pdf
人才流动引发的人事档案管理相关问题思考.docx
转——从拿破仑称帝看中西方皇帝的差异——一个课堂提问引发的思考.docx
初中语文语文论文一吃话引发的思考
chatgpt作为现象级产品受到广泛关注,本文从数据的数量、质量、驱动和保护4个方面,通过阐述chatgpt的数据特点,引发中医智能诊断研究中数据问题的思考。中医智能诊断研究需要建立数据共享模式和中医诊断的数据元标准,...
094-416-对城际铁路穿越城市边缘地区引发问题的思考-word资料.pdf
AlphaGo引发的对人工智能的思考[收集].pdf
由“差评”引发的深度思考.pdf