亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS開發系列--C語言之數組和字符串

2019-11-14 20:15:38
字體:
來源:轉載
供稿:網友

概覽

數組在C語言中有著特殊的地位,它有很多特性,例如它的存儲是連續的,數組的名稱就是數組的地址等。而在C語言中是沒有String類型的,那么如果要表示一個字符串,就必須使用字符數組。今天主要就介紹如下三個方面:

  1. 一維數組
  2. 多維數組
  3. 字符串

一維數組

一維數組操作比較簡單,但是需要注意,數組長度必須是固定的,長度不能使用變量進行初始化;如果聲明的同時進行賦值則數組長度可以省略,編譯器會自動計算數組長度;同時數組不能先聲明再一次性賦值(當然可以對每個元素一一賦值)。

#include <stdio.h>int main(){    int len = 2;    //int a[len] = { 1, 2};//錯誤,不能使變量    int a[2];//正確    a[0] = 1;    a[1] = 2;    //a[2] = 3;//超過數組長度,但是編譯器并不會檢查,運行報錯    int b['a'] = {1,2,3};//'a'=97,所以可以作為數組長度,但是后面的元素沒有初始化,其值默認為0    for (int i = 0; i < 97; ++i){        PRintf("b[%d]=%d/n",i,b[i]);    }    int c[2 * 3];//2*3是固定值可以作為數組長度    int d[] = { 1, 2, 3 };//如果初始化的同時賦值則數組長度可以省略,當前個數為3}

擴展--數組的存儲

數組在內存中存儲在一塊連續的空間中,如果知道數組類型(int、float等)和初始地址就可以知道其他元素的地址,同時由于數組名等于數組第一個元素的地址,所以當數組作為參數(作為參數時形參可以省略)其實是引用傳遞。

#include <stdio.h>int main(){    int const l = 3;    int a[l] = { 1, 2,3 };    for (int i = 0; i < l; ++i){        //由于當前在32位編譯器下,int型長度為4個字節,可以判斷出三個地址兩兩相差都是4        printf("a[%d]=%d,address=%x/n", i, a[i], &a[i]);    }    /*當前輸出結果:    a[0] = 1, address = c9f95c    a[1] = 2, address = c9f960    a[2] = 3, address = c9f964*/}

我們看一下上面定義的數組在內存中存儲結構

arrayAddress1.2

再來看一下數組作為參數傳遞的情況,數組作為參數傳遞的是數組的地址

#include <stdio.h>void changeValue(int a[]){ a[0] = 10;}int main(){ int a[2] = {1,2};    changeValue(a); for (int i = 0; i < 2; ++i){        printf("a[%d]=%d/n",i,a[i]);    } /*打印結果    a[0]=10    a[1]=2    */}

多維數組

多維數組其實可以看成是一個特殊的一維數組,只是每個元素又是一個一維數組,下面簡單看一下多維數組的初始化和賦值

#include <stdio.h>int main(){    int a[2][3];//2行3列,二維數組可以看成是一個特殊的一維數組,只是它的每一個元素又是一個一維數組    a[0][0] = 1;    a[0][1] = 2;    a[0][2] = 3;    a[1][0] = 4;    a[1][1] = 5;    a[1][2] = 6;    for (int i = 0; i < 2; ++i){        for (int j = 0; j < 3; ++j){            printf("a[%d][%d]=%d,address=%x/n", i, j, a[i][j], &a[i][j]);        }    }    /*打印結果    a[0][0]=1,address=f8fb24    a[0][1]=2,address=f8fb28    a[0][2]=3,address=f8fb2c    a[1][0]=4,address=f8fb30    a[1][1]=5,address=f8fb34    a[1][2]=6,address=f8fb38    */    //初始化并直接賦值    int b[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };    //由于數組的賦值順序是先從第一行第一列,再第一行第二列...然后第二行第一列...,所以我們也可以寫成如下形式    int c[2][3] = { 1, 2, 3, 4, 5, 6 };    //也可以只初始化部分數據,其余元素默認為0    int d[2][3] = { 1, 2, 3, 4 };    for (int i = 0; i < 2; ++i){        for (int j = 0; j < 3; ++j){            printf("d[%d][%d]=%d/n", i, j, d[i][j]);        }    }    /*打印結果    d[0][0]=1    d[0][1]=2    d[0][2]=3    d[1][0]=4    d[1][1]=0    d[1][2]=0    */    //當然下面賦值也可以    int e[2][3] = { {}, { 4, 5, 6 } };    //可以省略行號,但是絕對不可以省略列號,因為按照上面說的賦值順序,它無法判斷有多少行    int f[][3] = { {1,2,3},{4,5,6} };}

擴展--多維數組的存儲

以上面a數組為例,它在內存中的結構如下圖

arrayAddress2.1

根據上圖和一維數組的存儲,對于二維數組可以得出如下結論:數組名就是整個二維數組的地址,也等于第一行數組名的地址,還等于第一個元素的地址;第二行數組名等于第二行第一個元素的地址。用表達式表示:

  1. a=a[0]=&a[0][0]
  2. a[1]=&a[1][0]

同樣可以得出a[i][j]=a[i]+j。關于三維數組、四維數組等多維數組,其實可以以此類推,在此不再贅述。

字符串

在C語言中是沒有字符串類型的,如果要表示字符串需要使用char類型的數組,因為字符串本身就是多個字符的組合。但是需要注意的是字符串是一個特殊的數組,在它的結束位置必須要加一個”/0”(ASCII中0是空操作符,表示什么也不做)來表示字符串結束,否則編譯器是不知道什么時候字符串已經結束的。當直接使用字符串賦值的時候程序會自動加上”/0”作為結束符。

////  main.c//  ArrayAndString////  Created by KenshinCui on 14-7-06.//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#include <stdio.h>int main(int argc, const char * argv[]){    char a[] = {'K','e','n','s','h','i','n','/0'};    printf("%s",a); //結果:Kenshin,注意使用%s輸出字符串內容,如果換成整形輸出格式其實輸出的是a的地址    printf("/n");    printf("address=%x", a); //結果:address=5fbff890    printf("/n");    //后面的/0絕對不能省略,如果沒有/0則會出現如下情況    char b[] = { 'I', 'a', 'm'};    printf("%s",b); //沒有按照期望輸出,多了一些垃圾數據,在當前環境打印結果:IamKenshin    printf("/n");    printf("address=%x",b); //結果:address=5fbff88d    printf("/n");    //直接賦值為字符串,此時不需要手動添加/0,編譯器會自動添加    char c[] = "Kenshin";    printf("c=%s",c); //結果:c=Kenshin    printf("/n");        //二維數組存儲多個字符串    char d[2][3]={"Kenshin","Kaoru","Rose","Jack","Tom","Jerry"};            return 0;}

從上面代碼注釋中可以看到打印b的時候不是直接打印出來“Iam”而是打印出了“IamKenshin”,原因就是編譯器無法判斷字符串是否結束,要解釋為什么打印出“IamKenshin”我們需要了解a和b在內存中的存儲。

arrayAddress3.1

從圖中我們不難發現由于a占用8個字節,而定義完a后直接定義了b,此時分配的空間連續,b占用3個字節,這樣當輸出b的時候由于輸出完“Iam”之后并未遇到”/0”標記,程序繼續輸出直到遇到數組a中的“/0”才結束,因此輸出內容為“IamKenshin”。

擴展--字符串操作常用函數

下面簡單看一下和字符和字符串相關的常用的幾個函數

////  main.c//  ArrayAndString////  Created by Kenshin Cui on 14-7-04.//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#include <stdio.h>int main(int argc, const char * argv[]){    /*字符操作*/    putchar('a'); //結果:a,putchar一次只能輸出一個字符    printf("/n");    putchar(97);//結果:a    printf("/n");    char a;    a=getchar();//getchar()一次只能接收一個字符,可以接收空格、tab、回車    printf("a=%c",a);    printf("/n");    /*字符串操作*/    char b[]="Kenshin";    printf("b=%s",b);    printf("/n");    puts(b); //puts用于輸出單個字符串,不能像printf格式化輸出,會自動添加換行    printf("/n");        char c[10];    scanf("%s",c);//注意c沒必要寫成&c,因為c本身就代表了數組的地址    printf("c=%s/n",c);//注意即使你輸入的內容大于10,也能正確輸出,但是下面的gets()函數卻不行    printf("/n");        //gets()函數,注意它是不安全的,因為接收的時候不知道它的大小容易造成溢出,建議不要使用    char d[10];    gets(d); //gets一次只能接收一個字符串,但是scanf可接收多個;scanf不能接收空格、tab,gets則可以    printf("d=%s",d);    printf("/n");        char e[]={'K','s','/0'};    printf("%lu",strlen(e)); //結果是:2,不是3,因為/0不計入長度    printf("/n");    char f[]={"Kenshin"};    printf("%lu",strlen(f)); //結果是:7    printf("/n");        char g[5];    strcpy(g,"hello,world!");    printf("%s",g); //結果是:hello,即使定義的g長度為5,但是也能完全拷貝進去    printf("/n");    char h[5];    char i[]={'a','b','c','/0','d','e','f','/0'};    strcpy(h,i);    printf("%s",h); //結果是:abc,遇到第一個/0則結束    printf("/n");        strcat(i,"ghi");    printf("%s",i); //結果是:abcghi,注意不是abcdefghi,strcat,從i第一/0開始使用“ghi”覆蓋,覆蓋完之后加上一個/0,在內存中目前應該是:{'a','b','c','g','h','i','/0','f','/0'}    printf("/n");        char j[]="abc";    char k[]="aBc";    char l[]="acb";    char m[]={'a','/0'};    printf("%d,%d,%d",strcmp(j,k),strcmp(k,l),strcmp(l,m));//遇到第一個不相同的字符或/0則返回兩者前后之差,結果:32,-33,99    printf("/n");    return 0;}

 

注意:

1.在Xcode中會提示gets是不安全的,推薦使用fgets()。

2.strlen()只用于計算字符串長度,由于在C語言中字符串使用字符數組長度表示,所以它可以計算帶有’/0’結尾的字符數組長度,但是它并不能計算其他類型的數組長度。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕精品久久久久| 91视频免费网站| 国产精品最新在线观看| 亚洲xxxx视频| 中文字幕日韩精品在线观看| 国产精品一区二区三区在线播放| 亚洲精品一区久久久久久| 黑人精品xxx一区一二区| 欧美性xxxxx极品| 亚洲国产高清高潮精品美女| 亚洲网站在线播放| 亚洲欧美日韩另类| 亚洲第一综合天堂另类专| 久久免费视频在线观看| 欧美一区二区三区免费观看| 欧美贵妇videos办公室| 亚洲视频国产视频| 国产精品视频网| 欧美成人午夜激情在线| 亲子乱一区二区三区电影| 欧美亚洲成人免费| 欧美激情二区三区| 国产成人小视频在线观看| 日韩在线视频免费观看| 国产精品色悠悠| 91中文字幕在线观看| 亚洲成人网在线观看| 国产精彩精品视频| 亚州国产精品久久久| 欧美激情中文字幕乱码免费| 久久精品视频网站| 尤物tv国产一区| 久久伊人91精品综合网站| 98精品在线视频| 色七七影院综合| 欧美日韩人人澡狠狠躁视频| 亚洲欧美日韩国产中文专区| 成人福利网站在线观看11| 国模精品一区二区三区色天香| 欧美午夜精品在线| 亚洲japanese制服美女| 91久久久久久久久久| 久久久视频精品| 欧美激情视频三区| 国产91露脸中文字幕在线| 97精品欧美一区二区三区| 久久久最新网址| 欧美日韩福利视频| 亚洲国产成人91精品| 国产噜噜噜噜噜久久久久久久久| 91经典在线视频| 欧美极品少妇与黑人| 亚洲国产日韩一区| 亚洲性日韩精品一区二区| 日韩中文字幕在线观看| 亚洲国产欧美精品| 精品福利一区二区| 国色天香2019中文字幕在线观看| 欧美大胆a视频| 国产精品一区二区三区成人| 日韩男女性生活视频| 中日韩午夜理伦电影免费| 国产精品成人一区二区| 中文字幕日韩有码| 欧美激情中文字幕乱码免费| 深夜福利一区二区| 一区二区三区高清国产| 亚洲欧美国产另类| 国产精品视频午夜| 尤物yw午夜国产精品视频| 亚洲欧美日韩一区在线| 日本精品性网站在线观看| 欧美日韩在线视频一区二区| 国产视频精品自拍| 中文字幕日韩在线视频| 97视频在线播放| 成人免费看黄网站| 亚洲电影免费观看高清完整版| 国产精品久久久久久一区二区| 欧美精品在线免费| 国产精品一区二区久久久| 欧美贵妇videos办公室| 欧美影院成年免费版| 亚洲美女视频网| 一区二区三区无码高清视频| 亚洲最新av网址| 国产97人人超碰caoprom| 国产精品视频xxxx| 情事1991在线| 亚洲女成人图区| 欧美刺激性大交免费视频| 日韩欧美在线视频免费观看| 全球成人中文在线| 国产香蕉97碰碰久久人人| 亚洲精品乱码久久久久久金桔影视| 国产亚洲美女精品久久久| 性欧美视频videos6一9| 久久99亚洲热视| 亚洲大胆人体在线| 日韩av在线影视| 欧美性受xxxx黑人猛交| 亚洲欧洲午夜一线一品| 欧美限制级电影在线观看| 国产精品丝袜久久久久久不卡| 久久av红桃一区二区小说| 91色视频在线导航| 亚洲国产欧美精品| 久久福利网址导航| 亚洲最大激情中文字幕| 欧美理论电影在线播放| 久久久999国产| 日韩电视剧在线观看免费网站| 欧美精品videossex88| 成人黄色影片在线| 欧美成人h版在线观看| 成人h视频在线| 日韩av男人的天堂| 欧美性xxxxxx| 精品久久久久久电影| 日韩一区二区久久久| 一本色道久久88综合日韩精品| 91精品国产自产在线| 国内精品一区二区三区四区| 亚洲a级在线观看| 在线日韩日本国产亚洲| 欧美在线一区二区视频| 精品久久久久久中文字幕一区奶水| 欧美另类在线播放| 久久精品视频播放| 日本国产高清不卡| 欧美另类精品xxxx孕妇| 在线视频欧美日韩精品| 国产性色av一区二区| 美女久久久久久久久久久| 久久免费成人精品视频| 亚洲视频综合网| 欧美黄色小视频| 日韩av影院在线观看| 成人av.网址在线网站| 法国裸体一区二区| 日韩在线视频免费观看| 国产精品视频白浆免费视频| 亚洲国产精品专区久久| 国产精品网站大全| 久久人人爽人人| 国产亚洲美女久久| 欧美一级在线亚洲天堂| 国产精品久久久久久久久粉嫩av| 中文字幕亚洲综合久久筱田步美| 成人精品在线观看| 国产精品一区二区久久国产| 亚洲视频欧美视频| 久久久97精品| 国产精品久久久久久一区二区| 国内精品视频在线| 成人av在线网址| 欧美最猛性xxxxx(亚洲精品)| 成人网在线免费看| 国产精品久久99久久| 色综合久久久888| 久久精品国产亚洲精品2020| 国产精品久久久久久久美男| 欧美激情亚洲综合一区| xvideos亚洲|