指针指向字符串常量串

& 以前学C++的时候,对字符串和指针学的很模糊,现在有时间重新看C,开始还是很模糊,慢慢研究,渐渐有了头绪,决定写下来加深自己的印象。
首先,让我们来看 char shuzu[7];声明的字符串,直接上代码
#include&stdio.h&
int main(){&
char shuzu[7]="123456";
printf("%x\n",&shuzu);
printf("%x\n",shuzu);printf("%x\n",&shuzu[0]);
输出如图:
可以看到,输出的三个地址都相同。char shuzu[7]="123456"语句执行的时候,系统就分配了一段长7字节的连续内存,并把这段内存起名为shuzu,里面的值为"123456"
&shuzu,就是shuzu这个变量的内存地址,由于这段内存叫shuzu,所以shuzu的地址也就是这段内存的首地址,也就是'1'字符所在字节的地址;
shuzu,对于数组变量,可以使用变量名来索引变量中的内容,其实这里的shuzu可以理解成数组变量退化的指针,并且指向数组的开头,既然把它理解成指针,那么它的值肯定是地址了,所以他的值和上面的一样。(摘自互联网)
&shuzu[0],比较容易理解,第一个字符串的地址,因此和上面两个是一样的。
下面再来看以方法char *shuzu="123456";声明的字符串
#include&stdio.h&
int main(){&
char *shuzu="123456";
printf("%x\n",&shuzu);
printf("%x\n",shuzu);printf("%x\n",&shuzu[0]);
可以看出 ,第一个和后两个输出有点区别,我们一个一个分析
首先,char *shuzu 是声明一个char类型的指针变量,和数组名称不同,它在内存中有自己的地址
&shuzu :就是取存储指针变量的值,也就是shuzu这个变量在内存中存储的地址
shuzu:存储在指针变量中的值,指向"123456"这个数组的首地址("123456"返回值是一个char类型的指针)。
&shuzu[0]:数组中第一个字符的地址,和数组相同。
这里要弄清数组名称和真正指针的区别。
最后来看最让我头疼的 指针数组&
用该表达式声明一个指针数组char *shuzu[]={"1","2"};
#include&stdio.h&
int main(){
char *shuzu[]={"1","2"};printf("%x\n",&shuzu);
printf("%x\n",shuzu);
printf("%x\n",&shuzu[0]);return 0;
其实也很好理解,我们把指针数组看成是普通的数组,数组名称是shuzu,第一个值是shuzu[0],于是,这个数组和char shuzu[7]="123456"声明的数组大概相似了。只是一个数组里存储的char类型的指针,而另一个存储的是char类型的值,这样shuzu、&shuzu、和&shuzu[0]三个输出相同,我们也就明白了。
另外,*shuzu 的值是第一个字符串的地址。和shuzu不同。。
阅读(...) 评论()C#中使用指针实现高效比较字符串的小技巧 - C#教程 - 编程入门网
C#中使用指针实现高效比较字符串的小技巧
判断随机字符串之间的是否相等是程序设计中常用的技巧,再C++时代,我们可以通过把字符串中每四个字节转换为一个int对象,通过int对象一次比较四个字符,从而实现相对高效的字符串比较工作。那么,这个思路在C#中能否是实现呢?答案是肯定的。
在C#中使用上述思想,必须要解决两个问题,其一是在C#中使用指针,并且指针指向的托管变量位置不能被GC重新分配。其二,托管字符串在内存中与int或long之间的对应关系。
很多文章中已经详细描述了在C#中使用指针的方法,本文不再详细叙述,开启unsafe开关的方式为,右键单击解决方案目录&&选择属性&&再Build对话框中选中&允许unsafe代码&选项, 这样再C#中就可通过unsafe关键字标记可以使用指针的区域了。我们知道,被托管的变量由系统随机分配、回收和调整在内存中的位置,因此,指向托管变量的指针可能会由于托管变量被随机调整而指向错误区域。为了保证指针自始至终都能指向同一个托管变量,C#中提供了fixed语句来完成该任务。被标记了fixed的指针,在fixed所标志的区域中回自始至终的指向改变量,而系统不会对该托管变量进行调整和再分配。代码如下:
string str=&Hello World!&;
fixed (char* ps = str)
//该区域中ps始终指向托管字符串str
使用sizeof可以测出,C#中long占用8个字节,那么在上面代码中如果将ps的前8个字节强转为long型,得到的结果是什么呢?我们利用如下代码进行测试:
long nLow = 0, nHigh = 0;
string str = &Hello World!&;
fixed (char* ps = str)
char* psTemp =
n=*(long*)psT
nLow = n & 0xFFFF; //取最后两个字节
nHigh = (n && 16) & 0xFFFF; //取第3,4个字节
MessageBox.Show(((char)nLow).ToString() + & & + ((char)nHigh).ToString());
nLow = (n && 32) & 0xFFFF; //取第5,6个字节
nHigh = (n && 48) & 0xFFFF; //取第7,8个字节
MessageBox.Show(((char)nLow).ToString() + & & + ((char)nHigh).ToString());君,已阅读到文档的结尾了呢~~
delphi 截取字符串 delphi 字符..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Delphi基础字符串指针类型基础
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口}

我要回帖

更多关于 指针指向string 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信