非字符的指针进行操作
2013-05-10 08:46
106 查看
如果我们对一个非字符的指针进行操作,方法是这样的:
定义:int a=7;int *p=&a; 或者 int a=7;int *p;p=&a; 或者 int a=7;int *p; *p=a;
这样定义的原因是因为等号两边的类型必须匹配,int*p=&a; 等号左边定义的是一个指针,指针的内容是地址,所以等号右边也应该是地址,&a就是取空间a的地址,第二种情况 int*p;p=&a; 为什么不是 *p=&a 而是 p=&a; 因为在 定义的时候“*”只是说明p是一个指针,而p也是一个变量,不过是储存地址的一种特殊的变量,对于变量使用,我们都是直接使用它的名字,就好象,我们定义个常量 consta=7; 我们要调用它的时候直接使用a就可以了,并不需要带上 const 修饰,这里也一样,用指针变量时并不需要带上“*”,而第三种情
况中的“*”和第二种里面是不同的,这里的“*”是取内容符,与之相反的是取地址符“&”,分析一下,第三种情况中,等号左边是*p表示对指针p 取内容,它的内容指向内存中的某个已经在开始通过 int*p; 定义好的空间里(比较确切一点的说法是,p在定义的时候,其内容里的地址指向内存中某个 未知的空白区域,即未占用,不受保护的内存空间),这个空间里存放的数据类型是整型,所以等号的右边也应该是整型才能匹配,所以是 *p=a; 这里的 “*”和定义时候的是不同的,这一点很重要。
其实上面的都是些题外话,我要说的其实是关于指针的输出的一些问题。我们利用上面定义好的进行输出操作。
输出指针的内容(即所指向空间的地址):cout<<p<<endl;
输出指针所指的内容(即指针内容所描述地址空间中的内容):cout<<*p<<endl;
指针对于字符的处理却有些特殊,和前面的非字符的指针输出处理要分开理解。
比如,我们定义一个 chara='A'; char *p=&a; 如果我们调用上面非字符指针的输出方式,结果如下:
方式1 cout<<p<<endl; 结果 A####(#表示乱码,不可识别) 并不是地址
方式2 cout<<*p<<endl; 结果 A 这和非字符的指针情况一样,输出指针指向的内容
而且我们直接操作 cout<<&a<<endl; 结果和方式1的结果是完全相同的
为什么方式1输出的不是地址呢?这里有一个特殊的处理,虽然这里的p的内容确确实实是一个地址,但是cout操作字符指针的话,它遇到地址,就会直接去寻找这个地址所指向的内容,并把它的空间里的机器数按照字符的规则转化成字符输出,直到遇到“”这个操作符才停止。所以我们直接输出p的时候,它先输出‘A’然后再继续读取后面的内存空间知道遇到“”,显示结果是“A+乱码”。
你肯定会说,为什么要这样呢,这样多不方便呀,其实这么做是有目的的,而且恰恰就是为了方便才这么设置的。因为这样就可以很容易的处理字符串了,而处理字符串是我们在计算机中用得很多的操作。
比如我们第一个字符串数组 chara[]="mantou"; a[]在内存中在7个字节,而不是6个,因为在mantou字符串后面还隐藏有一个 “”,这时我们用 char*p=a; (这里不用&a是因为,a[]是一个数组,数组名a本身就是一个指针常量) 输出操作 cout<<p<<endl; 这里就不会输出地址,而是直接输出整个mantou字符串,很方便哈,如果我们 cout<<*p<<endl; 结果显示的是m,因为p是指向数组的首元素的地址的,就是指向这里的储存m的空间的地址,所以 取p的内容(*p),只能输出一个m哦。
虽然通常情况下我们是不需要了解我们的数据地址的,但我也顺便说说,怎么得到字符指针的地址,也可以方便大家对内存地址的分配再做更深入的研究。
char a='A'; 如果这里直接输出 cout<<&a<<endl; 当然是不能输出地址的,原理上面已经说过了,cout遇到字符型地址就会转换成字符输出。我们可以用指针p先取得a的地址(char*p=&a;),但是这样用 cout<<p<<endl; 也并不能得到地址呀,做个小技巧,首先我们知道p中的内容本身就是地址,但是因为它是字符串,我们又不能直接输出 它,所以呀,我们可以把指针里的内容(记载的是一个地址数据)强制转化成整型再输出 cout<<(int)p<<endl; 呵呵,这样就得到了这个指针里的内容——十进制型的地址,而我们知道,地址是用十六进制表示的,形式是 0x######## 0x后面加8位十六进制
数,我们把我们先得到的十进制地址按照地址的表示形式用流操作转化成十六进制就可以了。代码如下:
cout<<"0x"<<setfill('0')<<setw(8)<<setiosflags(ios::uppercase)<<hex<<(int)p<<dec<<setfill('')<<endl;//流控制实现十六进制地址输出
注意不要忘了 #include<iomanip.h> 这个头文件哦
定义:int a=7;int *p=&a; 或者 int a=7;int *p;p=&a; 或者 int a=7;int *p; *p=a;
这样定义的原因是因为等号两边的类型必须匹配,int*p=&a; 等号左边定义的是一个指针,指针的内容是地址,所以等号右边也应该是地址,&a就是取空间a的地址,第二种情况 int*p;p=&a; 为什么不是 *p=&a 而是 p=&a; 因为在 定义的时候“*”只是说明p是一个指针,而p也是一个变量,不过是储存地址的一种特殊的变量,对于变量使用,我们都是直接使用它的名字,就好象,我们定义个常量 consta=7; 我们要调用它的时候直接使用a就可以了,并不需要带上 const 修饰,这里也一样,用指针变量时并不需要带上“*”,而第三种情
况中的“*”和第二种里面是不同的,这里的“*”是取内容符,与之相反的是取地址符“&”,分析一下,第三种情况中,等号左边是*p表示对指针p 取内容,它的内容指向内存中的某个已经在开始通过 int*p; 定义好的空间里(比较确切一点的说法是,p在定义的时候,其内容里的地址指向内存中某个 未知的空白区域,即未占用,不受保护的内存空间),这个空间里存放的数据类型是整型,所以等号的右边也应该是整型才能匹配,所以是 *p=a; 这里的 “*”和定义时候的是不同的,这一点很重要。
其实上面的都是些题外话,我要说的其实是关于指针的输出的一些问题。我们利用上面定义好的进行输出操作。
输出指针的内容(即所指向空间的地址):cout<<p<<endl;
输出指针所指的内容(即指针内容所描述地址空间中的内容):cout<<*p<<endl;
指针对于字符的处理却有些特殊,和前面的非字符的指针输出处理要分开理解。
比如,我们定义一个 chara='A'; char *p=&a; 如果我们调用上面非字符指针的输出方式,结果如下:
方式1 cout<<p<<endl; 结果 A####(#表示乱码,不可识别) 并不是地址
方式2 cout<<*p<<endl; 结果 A 这和非字符的指针情况一样,输出指针指向的内容
而且我们直接操作 cout<<&a<<endl; 结果和方式1的结果是完全相同的
为什么方式1输出的不是地址呢?这里有一个特殊的处理,虽然这里的p的内容确确实实是一个地址,但是cout操作字符指针的话,它遇到地址,就会直接去寻找这个地址所指向的内容,并把它的空间里的机器数按照字符的规则转化成字符输出,直到遇到“”这个操作符才停止。所以我们直接输出p的时候,它先输出‘A’然后再继续读取后面的内存空间知道遇到“”,显示结果是“A+乱码”。
你肯定会说,为什么要这样呢,这样多不方便呀,其实这么做是有目的的,而且恰恰就是为了方便才这么设置的。因为这样就可以很容易的处理字符串了,而处理字符串是我们在计算机中用得很多的操作。
比如我们第一个字符串数组 chara[]="mantou"; a[]在内存中在7个字节,而不是6个,因为在mantou字符串后面还隐藏有一个 “”,这时我们用 char*p=a; (这里不用&a是因为,a[]是一个数组,数组名a本身就是一个指针常量) 输出操作 cout<<p<<endl; 这里就不会输出地址,而是直接输出整个mantou字符串,很方便哈,如果我们 cout<<*p<<endl; 结果显示的是m,因为p是指向数组的首元素的地址的,就是指向这里的储存m的空间的地址,所以 取p的内容(*p),只能输出一个m哦。
虽然通常情况下我们是不需要了解我们的数据地址的,但我也顺便说说,怎么得到字符指针的地址,也可以方便大家对内存地址的分配再做更深入的研究。
char a='A'; 如果这里直接输出 cout<<&a<<endl; 当然是不能输出地址的,原理上面已经说过了,cout遇到字符型地址就会转换成字符输出。我们可以用指针p先取得a的地址(char*p=&a;),但是这样用 cout<<p<<endl; 也并不能得到地址呀,做个小技巧,首先我们知道p中的内容本身就是地址,但是因为它是字符串,我们又不能直接输出 它,所以呀,我们可以把指针里的内容(记载的是一个地址数据)强制转化成整型再输出 cout<<(int)p<<endl; 呵呵,这样就得到了这个指针里的内容——十进制型的地址,而我们知道,地址是用十六进制表示的,形式是 0x######## 0x后面加8位十六进制
数,我们把我们先得到的十进制地址按照地址的表示形式用流操作转化成十六进制就可以了。代码如下:
cout<<"0x"<<setfill('0')<<setw(8)<<setiosflags(ios::uppercase)<<hex<<(int)p<<dec<<setfill('')<<endl;//流控制实现十六进制地址输出
注意不要忘了 #include<iomanip.h> 这个头文件哦
相关文章推荐
- Delphi 的内存操作函数(1): 给字符指针分配内存( 给字符指针(PChar、PWideChar、PAnsiChar)分配内存最佳的选择是StrAlloc。分配内存的时候会对字符串进行初始化)
- C#中使用Char类中的方法对字符进行各种操作,判断是否为字母、数字、标点符号、分隔符或空白。
- 第16周项目2-用指针操作字符串(2、删除字符指针做形参)
- 通过操作指针,与指针做函数参数'实现字串在主串中出现的次数,然后将出现的部分按照要求进行替换
- NSCharacterSet 对字符进行操作,去除空格回车字母等字符
- 数据结构与算法:单链表(利用万能指针实现对任意类型数据进行操作)
- C语言学习6 :指针的定义,指针类型要合法,指针要初始化,指针做函数参数,数组和指针的通用性,指针+1所代表的空间,void * 指针,交换函数中的指针,数组和字符型指针区别,字符型指针的应用,使用指针完成字符操作函数
- Delphi 的内存操作函数(1): 给字符指针分配内存
- c#指针进行图像操作
- Delphi 的内存操作函数(1): 给字符指针分配内存
- 使用字符/字节流对文件进行读写操作
- strcmp函数只能对字符指针(变化的地址)或数组名(固定的地址)进行比较asc2码
- RedHat中配置为字符界面启动同时对/dev/fb0操作进行配置
- 内置对象Clob对从数据库表中取的字符大对象CLOB类型的列值进行读取操作
- 利用CString类对字符串进行任意的操作,如字符的匹配或在字符串中间开始进行添加字符串
- 用指针对文本进行字符串替换操作
- 进行字符操作的工具类!转换字符
- 字符数组和字符指针间的操作
- IO操作 通过字符数组进行读取
- 关于字符数组的指针移动操作