青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

有關char指針的文章一篇

[文章] 有關char指針的文章一篇

作者:未知 來源:月光軟件站 加入時間:2005-2-28 月光軟件站

[文章] 有關char指針的文章一篇(轉自:http://www.moon-soft.com/doc/9040.htm)

先看以下代碼: 
char *p; 
p="abc"; 
你認為是對的嗎? 

答案:語法上是對的,但不提倡這種寫法。 

誤區1:沒有給p分配內存空間就賦值,怎么會是對的呢? 
正解:不少人第一眼將這里的p="abc"看成了*p="abc",然后就做出了以上的論斷。這是比較笨笨的錯誤咯:) 
看清楚就好啦,其實賦給p的是"abc"的地址。再說,*p="abc"也不對呀,字符串可不能這么賦值。 

誤區2:這"abcd"哪來的地址,怎么能直接賦給p呢? 
正解:先自己試試吧。在2K/XP + VC下運行這段代碼,是不會出錯的,說明這段代碼并無問題。暈吧?猜想的話呢,就是"abcd"不知道被放在了什么地方,然后弄來了一個地址,給了p。 

這到底是怎么回事呢? 

要知道,這兩個語句和char *p="abc"是完全一樣的,所以其中的道理也一樣。 
char *p="abc"曾經迷惑了不少人呀。問問你:p到底是什么類型的?char *?錯,是const char *! 
也就是說,它所指向的內容是不可改變的。不過要補充的是,a的指向是可以改變的。 
所以為了不再引起誤會,char *p="abc這種寫法是不提倡的。 
既然char *p="abcd"被建議寫成const char *p="abcd",那么char *p; p="abcd";也應該寫成const char *p; p="abcd"; 

講來講去,最后來得看看匯編代碼。看完就明白是怎么回事了。(我才發現匯編代碼原來這么爽看!VC下,沒開編譯器優化): 
我們重點先看const char *p="abc"和char p[]="abc"有什么不同(都放在main()中聲明): 

PHP源碼:

void main
()
{
  const 
char *p="abc";
}

3:        const char *p="abc";
00401028   mov         dword ptr [ebp-4],offset string "abc" (0041f01c)

void main()
{
  
char p[]="abc";
}

3:        char p[]="abc";
00401028   mov         eax,[string "abc" (0041f01c)]
0040102D   mov         dword ptr [ebp-4],eax


看出差別了嗎?上一段ASM用offset取"abc"的地址,然后賦給[ebp-4],也就是p(下同)。 
而下一段ASM卻轉了一個彎,先把"abc"的地址轉到寄存器eax,然后再轉賦給p。 

有疑問了:為什么不和上面的一樣,直接用offset?VC是很聰明的(廢話,M$的東西呀),不用offset,恐怕就是用不了了。 
offset是一條偽指令,在編譯的時候就已經把偏移量算好了。offset是無法執行間接尋址的計算的。 

說明了什么? 

const char *p="abc"中的"abc",在編譯期間就已經處理好,要了一塊內存,存起來了!在把地址賦給p的時候,就可以直接用offset計算。 
而char p[]="abc"中的"abc",是在運行期間動態分配內存給"abc",然后再算出地址,賦給p。hehe,這同時也說明了數組和指針的等價性。 

我們再做一次實驗,這一次我們把char p[]="abc"放在main()外,并在main()內用一個指針再指向p看看。 
PHP源碼:

char p
[]="abc";

void main()
{
  
char *t=p;
}

5:      char *t=p;
00401028   mov         dword ptr [ebp-4],offset p (00421adc)


這回p[]的聲明放在main()外,變成了全局變量。結果main()內的t取p的指針的時候,直接用offset可以計算出來。 

據小石頭所說,字面值,const,static,inline,全局變量都是放在靜態數據區的。(但我感覺似乎不是如此,只是全局變量和字符串在編譯時就處理好放在一起) 

不難發現,p[]被聲明成全局變量后,就可以直接用offset計算地址,說明靜態數據區是編譯時就已經處理好的。
再對照const char *p="abc"的ASM,我們馬上想到:"abc"就是被C/C++存在靜態數據區中的!它的地址就是"abc"在靜態數據區的地址! 

弄清了這個,有些問題也就可以想得通了。下面這種用法,看來不能說是錯誤的了,因為"abc"是在靜態數據區的,生存期可以說是整個程序: 
PHP源碼:

#include "stdio.h"

const char *fun()
{
  const 
char *p="abc";
  return 
p;
}

void main()
{
  const 
char *t=fun();
  
printf ("%s",t);
}



看ASM: 
PHP源碼:

5
:      const char *p="abc";
00401038   mov         dword ptr [ebp-4],offset string "%d" (0042001c)


一樣也是使用offset計算地址。 

C/C++給字符串的待遇真是太好了。為了一個字符串,幾乎可以打破所有的指針規則。暈~~~~(完) 

附:第一次寫這么長的文章,寫得挺暈的。本來我的C/C++也不是很純熟的,ASM也是一知半解,今天在CSDN上為這個問題郁悶了半天,和幾個人討論了一下,最后就寫了這么一篇文章。希望大家賞臉看看~~~有錯一定要指正啊!最后特別感謝小石頭(想飛的菜鳥,驕傲的石頭,菜菜,都是他咯),還有小阿哥(就是Kingzeus咯)的幫忙~~~~~~謝謝咯~~~~~~

 

 

__________________
小菜虎 -> 菜菜的老虎

驕傲的石頭回復:

堆幾盤積木,心情好些了,所以再重新寫一遍。 
關于字符串的這個問題,我一直在心里困惑著。所以呢,昨天就看了一下。 
以前回答別人的時候,總是很簡單的回答,字符串就是const char *指針,指向它的入口地址。現在想來真是慚愧,雖然這個事實好象已經為大家所接受,甚至沒有人探討過這個問題!所以我相信我的發現對大家大多數是有好處的。 
首先請看以下代碼 

PHP源碼:

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    const 
char *0;
    
char *p2 p;
    return 
0;
}



以上代碼有問題嗎? 如果你說沒有,請你試一下。很明顯,這是有問題的。const是為了保證不變性,而你把他變成non const,肯定有錯誤或者警告,要么就要用const_cast轉換。 
所以上面的代碼不能通過編譯。 

那么這就很明顯的在lee的post里出現了問題,當然我以前也一直是這么認為,甚至很多人都是這么認為。難道這是編譯器對字符串的特殊處理嗎? 還是其他的原因? 

于是我想看看究竟。就動用了RTTI,我飛快的鍵入了以下代碼。 

PHP源碼:

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
   
cout << typeid("abc").name() << endl;
   return 
0;
}



你說結果是什么? 
是char [4]!而不是const char *; 
好,這個結果解決了我心中的疑點,原來是這樣!這可以很簡單的解釋char *p = "abc"這個問題。 數組是一個char *const 指針,當然可以賦給char *指針而不會影響其常量性。所以這是完全正確的賦值。 
其實這想起來也很平常,指針是沒有分配空間的地址而已,而數組是一種容器,占用連續的儲存空間。想想字符串就該知道它是一個數組!而不是指針!真正意義上的指針只能是地址,而它在分配了連續的空間后可以作為數組來使用,這是由于他們的共性而決定的。 

哈哈!心情愉快,所以也接著看了下lee上面所做的探討。字符串是放在靜態儲存區沒錯,毫無疑問。至于位置~ 偶不想多說,lee在上面分析了很多。所以我只對它進行了一下簡單的測試。 
我手頭上只有dev c++ 和 vc70編譯器,所以就只用他們進行了測試。(打開了全部優化) 

PHP源碼:

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    
char *"abc"
    
char *p2 "abc";
    
p[1] = 'k';
    
p2[1] = 'j'
    
cout << p1 << endl;
    
cout << p2 << endl;
    return 
0;
}



結果呢?在dev c++下報錯, 原因我想可能是因為在dev c++在對靜態儲存區進行了保護。而vc70下,通過,并且兩個輸出是不同的。所以偶去看vc70產生的msil碼,原來vc70每次處理字符串都在靜態區分配了空間,而且這兩個"abc"是連續分配的!這里就沒有出現Solmyr說的那種情況。我想一般比較好的編譯器也應該這么說。至于vc60,偶沒有測試,但是可能Solmyr說的情況會出現吧。但這樣是不好的,相信這樣會出現很多微妙的情況。 
所以,引用字符串的最佳格式是const char *指針,但char *指針是完全沒錯的。于情于理,也說的過去吧  

如果你還要問,那用指針接受數組呢? 呵呵,你該仔細看看前面了。相信這會給你幫助。

 

 

__________________
不可一日無酒無肉無女人

posted on 2011-05-03 10:50 MrRightLeft 閱讀(473) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

<2011年5月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

導航

統計

隨筆分類

隨筆檔案

文章分類

文章檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲尤物影院| 99在线精品观看| 亚洲三级电影全部在线观看高清| 亚洲电影视频在线| 欧美性猛交视频| 亚洲视频免费看| 亚洲无线视频| 亚洲第一精品夜夜躁人人躁 | 久久午夜电影| 欧美成熟视频| 亚洲欧美在线一区| 免费看亚洲片| 久久国产精品网站| 欧美激情精品久久久| 亚洲专区免费| 欧美精品一区二区三区蜜桃| 久久国产欧美精品| 久久亚洲美女| 国产精品老牛| 亚洲天堂偷拍| 一区二区三区高清视频在线观看| 午夜精品99久久免费| 亚洲无线一线二线三线区别av| 欧美一区二区三区免费在线看| 亚洲人体1000| 另类尿喷潮videofree| 欧美在线免费观看| 国产精品欧美一区喷水| 中文在线不卡视频| 欧美一区视频| 国产日本亚洲高清| 日韩一本二本av| 亚洲一区精品电影| 欧美日韩精品综合在线| 一本大道久久a久久综合婷婷 | 一区二区免费在线播放| 欧美激情一区二区三级高清视频| 欧美大片在线看| 亚洲免费精品| 欧美日韩亚洲不卡| 午夜日本精品| 亚洲国产精品一区| 一区二区高清视频| 国产伪娘ts一区| 欧美成人午夜剧场免费观看| 最新日韩精品| 久久久噜噜噜久久久| 永久久久久久| 欧美午夜视频| 久久国产精品电影| 在线视频亚洲| 蜜乳av另类精品一区二区| 欧美+亚洲+精品+三区| 日韩一级不卡| 欧美国产日韩一区二区| 亚洲欧美激情视频| 亚洲精品1234| 国产精品尤物| 国产精品久久久久久久7电影| 久久视频一区二区| 欧美一进一出视频| 亚洲伦伦在线| 最新亚洲视频| 久久性色av| 久久久99爱| 欧美在线视频网站| 亚洲中字黄色| 亚洲一二三区精品| 亚洲欧美日韩国产一区二区三区 | 在线亚洲电影| 国产精品国色综合久久| 欧美日韩高清在线观看| 亚洲性感美女99在线| 亚洲尤物在线视频观看| 国产日韩欧美91| 国产婷婷色一区二区三区| 久久综合色影院| 亚洲国产岛国毛片在线| 亚洲欧美视频在线观看| 午夜精品久久久久久久久| 亚洲欧美在线x视频| 久久成人资源| 美女亚洲精品| 亚洲品质自拍| 亚洲午夜日本在线观看| 欧美一区二区三区婷婷月色| 久久视频精品在线| 亚洲一区二区三区午夜| 久久不射中文字幕| 欧美国产综合视频| 亚洲美女啪啪| 久久九九久久九九| 国产精品久久九九| 尤物yw午夜国产精品视频| 一区二区日本视频| 久久婷婷丁香| 亚洲精品久久嫩草网站秘色| 亚洲欧美国产三级| 欧美黄色一区| 亚洲国产日韩欧美在线99| 亚洲性视频网址| 亚洲国产91| 亚洲综合成人在线| 欧美视频中文一区二区三区在线观看| 狠狠色狠狠色综合日日tαg| 亚洲在线一区二区| 亚洲精品一二| 免费观看久久久4p| 亚洲第一精品在线| 蜜月aⅴ免费一区二区三区| 亚洲深夜福利视频| 欧美激情一二区| 在线一区视频| 国产精品视频久久| 羞羞漫画18久久大片| 国产精品99久久99久久久二8 | 欧美欧美午夜aⅴ在线观看| 精品成人在线观看| 久久全球大尺度高清视频| 久久九九精品| 亚洲三级性片| 亚洲日韩视频| 国产精品女人久久久久久| 欧美日韩免费在线观看| 日韩视频在线观看| 日韩亚洲成人av在线| 国产精品成人国产乱一区| 亚洲图片欧美一区| 欧美在线啊v一区| 在线日韩电影| 亚洲免费观看| 国产一区二区精品丝袜| 欧美国产一区二区在线观看| 欧美区一区二区三区| 久久久久久自在自线| 99综合在线| 久久人人97超碰国产公开结果| 一区二区不卡在线视频 午夜欧美不卡'| 亚洲一级黄色| 亚洲美女视频网| 欧美一区日韩一区| 在线精品视频一区二区| 亚洲乱码国产乱码精品精| 激情一区二区| 性亚洲最疯狂xxxx高清| 一区二区三区回区在观看免费视频| 欧美一区二区三区免费大片| 中文亚洲视频在线| 欧美顶级大胆免费视频| 欧美成人免费一级人片100| 国产一区二区三区在线观看精品 | 亚洲综合色噜噜狠狠| 亚洲国产另类久久久精品极度 | 欧美资源在线观看| 中文精品视频| 欧美激情区在线播放| 欧美激情中文字幕在线| 亚洲电影第1页| 久久精品官网| 亚洲第一区中文99精品| 国产精品任我爽爆在线播放| 国产精品久久久久一区二区| 免费观看欧美在线视频的网站| 毛片av中文字幕一区二区| 一区二区三区高清| 亚洲人成网站色ww在线| 国产精品久久久久国产a级| 欧美www在线| 一区二区日韩| 久久综合色一综合色88| 亚洲人成啪啪网站| 国产精品美女久久久| 久久电影一区| 夜夜嗨av一区二区三区网页| 猛男gaygay欧美视频| 亚洲欧美制服另类日韩| 在线观看欧美成人| 欧美大香线蕉线伊人久久国产精品| 亚洲视频在线观看三级| 久久精品国产精品亚洲精品| 激情另类综合| 欧美日韩伦理在线免费| 欧美一区二区在线| 最新热久久免费视频| 久久综合九色综合欧美狠狠| 亚洲国产精品999| 激情五月综合色婷婷一区二区| 欧美成人精品在线播放| 欧美插天视频在线播放| 欧美成人国产一区二区| 欧美美女日韩| 国产精品qvod| 国产精品揄拍500视频| 欧美日韩另类国产亚洲欧美一级| 免费在线欧美黄色| 欧美成人一区在线| 欧美mv日韩mv国产网站| 欧美国产日韩精品| 久久久久久久91| 欧美精品一区在线观看|