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

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  117 Posts :: 2 Stories :: 61 Comments :: 0 Trackbacks

常用鏈接

留言簿(8)

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

第一個程序:演示了如何使用new來創建動態數組以及使用數組表示法來訪問元素,還指出了指針和真正的數組名之間的差別

#include "stdafx.h"
#include 
<iostream>
using namespace std;
int main(int argc, char* argv[])
{
    
double * p3=new double[3];//space for 3 doubles
    p3[0]=0.2;
    p3[
1]=0.5;
    p3[
2]=0.8;
    cout
<<"p3[1] is "<<p3[1]<<endl;
    p3
=p3+1;//increment the pointer
    cout<<"Now p3[0] is "<<p3[0]<<" and ";
    cout
<<"p3[1] is "<<p3[1]<<endl;
    p3
=p3-1;//point back to beginning
    delete[] p3;
    
return 0;
}

      不能修改數組名的值。但指針是變量,因此可以修改它的值。請注意將p3加1的效果,表達式p3[0]現在指的是數組的第2個值。因此,將p3加1導致它指向第2個元素而不是第1個。將它減1后,指針將指向原來的值,這樣程序便可以給delete[]提供正確的地址。

                                                                                 第二個程序:指針算術,C++將數組名解釋為地址

#include "stdafx.h"
#include 
<iostream>
using namespace std;
int main(int argc, char* argv[])
{
    
double wages[3]={10000.0,20000.0,30000.0};
    
short stacks[3]={3,2,1};

    
//Here are two ways to get the address of an array
    double * pw=wages;    //name of an array = address
    short * ps=&stacks[0];    //or use address operator
    
//with array element
    cout<<"pw = "<<pw<<", *pw = "<<*pw<<endl;
    pw
=pw+1;
    cout
<<"pw = "<<pw<<", *pw = "<<*pw<<"\n\n";

    cout
<<"ps = "<<ps<<", *ps = "<<*ps<<endl;
    ps
=ps+1;
    cout
<<"add 1 to the ps pointer:\n";
    cout
<<"ps = "<<ps<<", *ps = "<<*ps<<"\n\n";

    cout
<<"access two elements with array notation\n";
    cout
<<"stacks[0] = "<<stacks[0]<<", stacks[1] = "<<stacks[1]<<endl;
    cout
<<"access two elements with pointer notation\n";
    cout
<<"*stacks = "<<*stacks<<", *(stacks+1) = "<<*(stacks+1)<<endl;

    cout
<<sizeof(wages)<<" = size of wages array\n";
    cout
<<sizeof(pw)<<" = size of pw pointer\n";
    
return 0;
}
      在多數情況下,C++將數組名解釋為數組第1個元素的地址。
      記?。簩⒅羔樧兞考?后,其增加的值等于指向的類型占用的字節數。
      在很多情況下,可以相同的方式使用指針名和數組名。對于它們,可以使用數組方括號表示法,也可以使用解除引用操作符(*)。在多數表達式中,它們都表示地址。區別之一是,可以修改指針的值,而數組名是常量。
  pointername = pointername+1;      //valid
  arrayname = arrayname + 1;      //not allowed

      對數組應用sizeof操作符得到的是數組的長度,而對指針應用sizeof得到的是指針的長度,即使指針指向的是一個數組。   

                                                                                     第三個程序:如何使用不同形式的字符串

#include "stdafx.h"
#include 
<iostream>
#include 
<cstring>    //declare strlen(),strcpy()
using namespace std;
int main(int argc, char* argv[])
{
    
char animal[20= "bear";    //animal holds bear;
    const char * bird = "wren";    //bird holds address of string
    char * ps;    //uninitialized

    cout
<<animal<<" and ";    //display bear
    cout<<bird<<"\n";    //display wren

    cout
<<"Enter a kind of animail: ";
    cin
>>animal;

    ps
=animal;
    cout
<<ps<<"s!\n";
    cout
<<"Before using strcpy();\n";
    cout
<<animal<<" at "<<(int *)animal<<endl;
    cout
<<ps<<" at "<<(int *)ps<<endl;

    ps 
= new char[strlen(animal)+1];//get new storage
    strcpy(ps,animal);//copy string to new storage
    cout<<"After using strcpy():\n";
    cout
<<animal<<" at "<<(int *)animal<<endl;
    cout
<<ps<<" at "<<(int *)ps<<endl;
    delete [] ps;
    
return 0;
}
      數組和指針的特殊關系可以擴展到C-style string,看下面代碼:      
char flower[10= "rose";
cout
<<flower<<"s are red\n";
      數組名是第一個元素的地址,因此cout語句中的flower是包含字符r的char元素的地址。cout對象認為char的地址是字符串的地址,因此它打印該地址處的字符,然后繼續打印后面的字符,直到遇到空字符(\0)為止??傊绻ocout提供一個字符的地址,則它將從該字符開始打印,直到遇到空字符為止。

      在C++中,用引號括起的字符串像數組名一樣,也是第一個元素的地址。上述代碼不會將整個字符串發送給cout,而只是發送該字符串的地址。這意味著對于數組中的字符串、用引號括起的字符串常量以及指針所描述的字符串,處理的方式是一樣的,都將傳遞它們的地址。與逐個傳遞字符串中的所有字符相比,這樣做的工作量確實要少。
      記?。涸赾out和多數C++表達式中,char數組名、指向char的指針以及用引號括起的字符串常量都被解釋為字符串第一個字符的地址。
      上述的程序中,函數strlen(),返回字符串的長度。函數strcpy()將字符串從一個位置復制到另一個位置。
    const char * bird = "wren";    
      記住,“wren”實際表示的是字符串的地址,因此這條語句將“wren”的地址賦給了bird指針(一般來說,編譯器在內存留出一些空間,以存儲程序源代碼中所有用引號括起來的字符串,并將每個被存儲的字符串與其地址關聯起來)。這意味著可以像使用字符串“wren”那樣使用指針bird。
      字符串字面值是常量,這就是為什么代碼在聲明中使用關鍵字const的原因。以這種方式使用const意味著可以用bird來訪問字符串,但不能修改它。
      C++不能保證字符串字面值被唯一地存儲。也就是說,如果在程序中多次使用了字符串字面值“wren”,則編譯器將可能存儲該字符串的多個副本,也可能只存儲一個副本。如果是后面一種情況,則將bird設置為指向一個“wren”,將使它只是指向該字符串的唯一一個副本。將值讀入一個字符串可能會影響被認為是獨立的、位于其他地方的字符串。無論如何,由于bird指針被聲明為const,因此編譯器將禁止改變bird指向的位置中的內容。
      試圖將信息讀入ps指向的位置將更糟。由于ps沒有被初始化,因此并不知道信息將被存儲在哪里,這甚至可能改寫內存中的信息。幸運的是,要避免這種問題很容易——只要使用足夠大的char數組來接受輸入即可。請不要使用字符串常量或未被初始化的指針來接受輸入。為避免這些問題,也可以使用std::string對象,而不是數組。
      注意,將animal賦給ps并不會復制字符串,而只是復制地址。這樣,這兩個指針將指向相同的內存單元和字符串。
      要獲得字符串的副本:首先,需要分配內存來存儲該字符串,可以通過聲明另一個數組或使用new來完成。接下來,需要將animal數組的字符串復制到新分配的空間中。將animal賦給ps是不可行的,因為這樣只能修改存儲在ps中的地址,從而失去程序訪問新分配內存的唯一途徑。需要使用庫函數strcpy():strcp()函數接受2個參數,第一個是目標地址,第二是要復制的字符串的地址。應確定,分配了目標空間,并有足夠的空間來存儲副本。
      經常需要將字符串放到數組中。初始化數組時,使用=操作符。否則應使用strcpy()或strncpy()。
      如果數組的大小比字符串小,函數將字符串中剩余的部分復制到數組后面的內存字節中,可能會覆蓋程序正在使用的其他內存。要避免這種問題,使用strncpy()。該函數還接受第3個參數——要復制的最大字節數。不過,要注意的是,如果該函數在到達字符串結尾之前,目標內存已經用完,則它將不會添加空字符串。因此,應該這樣使用該函數: 
    strncp(food,"a picnic basket filled with many goodies",19);
    food[
19]='\0';



第四個程序:一個使用new和delete的范例

      下面介紹一個使用new和delete來存儲通過鍵盤輸入的字符串的。該程序定義了一個函數getname(),該函數返回一個指向輸入字符串的指針。該函數將輸入讀入到一個大型的數組中,然后使用new[]創建一個剛好能夠存儲該輸入字符串的內存塊,并返回一個指向該內存塊的指針。對于讀取大量字符串的程序,這種方法可以節省大量的內存。
     另外,可以使用new根據需要的指針數量來分配空間,就目前而言,這有點不切實際。下面程序演示了一些技巧。
#include "stdafx.h"
#include 
<iostream>
#include 
<cstring>    //or string.h
using namespace std;
char * getname(void);    //function prototype
int main(int argc, char* argv[])
{
    
char * name;//create pointer but no storage

    name
=getname();//assign address of string to name
    cout<<name<<" at "<<(int*)name<<"\n";
    delete[] name;
//memory freed

    name
=getname();//reuse freed memory
    cout<<name<<" at "<<(int*)name<<"\n";
    delete[] name;
//memory freed again
    return 0;
}

char * getname()    //return pointer to new string
{
    
char temp[80];//temporary storage
    cout<<"Enter last name: ";
    cin
>>temp;
    
char * pn=new char[strlen(temp)+1];
    strcpy(pn,temp);
//copy string into smaller space
    
    
return pn;//temp lost when function ends
}

      C++不保證新釋放的內存就是下一次使用new時選擇的內存。從程序的運行結果可知,確實不是。
      在上面程序中,getname()分配內存,而main()釋放內存。將new和delet放在不同的函數中通常并不是一個好辦法,因為這樣很容易忘記使用delete。
posted on 2010-02-06 14:46 煙皚 閱讀(407) 評論(0)  編輯 收藏 引用 所屬分類: C++ primer plus學習筆記
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲另类春色国产| 亚洲国产欧美在线| 亚洲人成毛片在线播放女女| 日韩午夜激情| 亚洲天堂免费观看| 欧美成人亚洲| 亚洲国产天堂久久国产91| 国产精品成人一区二区艾草| 国产精品美女在线观看| 在线观看欧美成人| 欧美在线free| 午夜日韩在线观看| 国产精品久久久久久久久搜平片 | 亚洲女女女同性video| 国产亚洲va综合人人澡精品| 宅男精品视频| 亚洲国产天堂久久国产91| 久久激情久久| 黄色日韩在线| 免费久久99精品国产| 久久久久久久激情视频| 国产一区二区三区四区老人| 久久精品国产亚洲一区二区三区| 亚洲手机视频| 国产欧美精品一区aⅴ影院| 午夜久久久久久久久久一区二区| 亚洲特级毛片| 国产色产综合产在线视频| 欧美自拍偷拍| 久久久久久久久久久成人| 亚洲电影观看| 欧美福利一区| 1024成人| 亚洲影视在线| 欧美色精品在线视频| 亚洲免费观看高清完整版在线观看熊| 久久成人综合视频| 嫩模写真一区二区三区三州| 亚洲夜间福利| 久久精品人人做人人爽| 激情综合网激情| 亚洲尤物视频网| 一区二区三区黄色| 久久夜色精品亚洲噜噜国产mv| 欧美一级专区| 噜噜噜躁狠狠躁狠狠精品视频 | 欧美日韩在线不卡| 亚洲影音先锋| 欧美在线www| 亚洲视频大全| 亚洲伦理自拍| 一本久道综合久久精品| 黑人一区二区三区四区五区| 性欧美激情精品| 亚洲一区二区精品在线| 1024欧美极品| 美女主播一区| 最近中文字幕日韩精品| 亚洲欧美中文在线视频| 黄色在线一区| 亚洲精品精选| 韩国福利一区| 99pao成人国产永久免费视频| 欧美电影在线播放| 亚洲第一网站| 欧美亚洲免费电影| 亚洲精品黄色| 欧美日韩三区四区| 免费日韩av| 亚洲欧美日韩另类| 一区二区高清视频在线观看| 亚洲国产精品一区二区久| 久久爱www久久做| 久久久欧美一区二区| 亚洲视频综合在线| 欧美国产日韩在线| 久久久久久久欧美精品| 亚洲免费在线播放| 中国亚洲黄色| 蜜臀91精品一区二区三区| 亚洲黄色在线| 国产一区在线观看视频| 欧美日本在线| 欧美成人精品在线观看| 久久精品视频99| 国产精品欧美日韩久久| 老牛影视一区二区三区| 亚洲欧美日本国产专区一区| 在线视频欧美一区| 亚洲欧美国产精品专区久久| 夜夜精品视频| 一区二区日本视频| 99视频+国产日韩欧美| 亚洲一区精品电影| 欧美一区二区三区四区在线| 午夜视频在线观看一区二区三区| 一区二区三区产品免费精品久久75| 黄色欧美成人| 欧美私人啪啪vps| 欧美日韩在线视频观看| 欧美全黄视频| 国产精品久久久久久久9999| 狠狠干狠狠久久| 日韩亚洲国产精品| 欧美一区二区在线免费观看| 久久久久久亚洲精品不卡4k岛国| 亚洲欧美另类久久久精品2019| 午夜精品久久久久久久99热浪潮| 欧美一区二区三区久久精品茉莉花| 久久国产视频网| 欧美国产乱视频| 欧美一区二区大片| 欧美色综合天天久久综合精品| 国产亚洲欧洲一区高清在线观看| 一区二区三区欧美在线| 亚洲二区视频| 免费在线看一区| 在线视频你懂得一区| 免费在线国产精品| 国产欧美精品日韩区二区麻豆天美| 亚洲无限av看| 亚洲欧美日韩成人| 国产精品综合久久久| 亚洲欧美日韩成人| 午夜精品久久久久久99热软件 | 国产精品日韩精品| 亚洲制服av| 欧美在线观看视频一区二区| 国产精品亚洲成人| 免费不卡在线视频| 欧美电影美腿模特1979在线看| 日韩天堂在线观看| 亚洲图片欧美日产| 狠狠色综合网| 亚洲激情网站| 国产欧美亚洲视频| 亚洲二区在线| 国产午夜亚洲精品不卡| 欧美成人一区在线| 国产精品久久一区二区三区| 久久av资源网| 欧美视频一区二区三区在线观看| 久久全球大尺度高清视频| 国产精品久久网站| 欧美大片专区| 国产在线高清精品| 亚洲一区二区精品在线观看| 亚洲福利av| 免费久久99精品国产| 欧美一区二区三区免费观看视频| 欧美人成网站| 91久久线看在观草草青青| 永久域名在线精品| 欧美制服丝袜| 久久蜜桃av一区精品变态类天堂| 国产精品一区二区你懂的| 一二美女精品欧洲| 午夜精品久久久久久久蜜桃app| 欧美国产三区| 日韩视频一区二区三区在线播放免费观看 | 亚洲国产欧美不卡在线观看| 欧美人与性动交α欧美精品济南到| 欧美一级午夜免费电影| 欧美视频一区二区三区四区| 9国产精品视频| 亚洲欧美日韩国产一区二区| 国产精品国产| 香蕉尹人综合在线观看| 欧美在线观看你懂的| 国产伊人精品| 欧美大片网址| 亚洲视频网在线直播| 久久久久国产精品www| 一色屋精品视频在线观看网站| 久久久久久97三级| 亚洲精品美女| 久久久久看片| 亚洲狼人综合| 国产在线欧美| 欧美视频免费在线| 久久精品国产第一区二区三区| 欧美成人日本| 欧美中文字幕视频| 99精品视频一区| 韩国精品久久久999| 欧美日韩一区成人| 免费日韩一区二区| 欧美一区2区三区4区公司二百 | 欧美精品乱人伦久久久久久| 亚洲欧美日韩中文在线制服| av不卡在线观看| 美脚丝袜一区二区三区在线观看 | 亚洲第一在线视频| 久久婷婷国产综合精品青草| 亚洲中午字幕| 亚洲视频一区二区| 亚洲人永久免费| 国产欧美日韩三区| 蜜桃久久精品乱码一区二区| 亚洲精品一二区|