麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統(tǒng) > iOS > 正文

IOS開發(fā)之路--C語言數(shù)組和字符串

2020-07-26 03:36:37
字體:
供稿:網(wǎng)友

概覽

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

一維數(shù)組 多維數(shù)組 字符串

一維數(shù)組

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

#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;//超過數(shù)組長度,但是編譯器并不會檢查,運行報錯  int b['a'] = {1,2,3};//'a'=97,所以可以作為數(shù)組長度,但是后面的元素沒有初始化,其值默認為0  for (int i = 0; i < 97; ++i){    printf("b[%d]=%d/n",i,b[i]);  }  int c[2 * 3];//2*3是固定值可以作為數(shù)組長度  int d[] = { 1, 2, 3 };//如果初始化的同時賦值則數(shù)組長度可以省略,當前個數(shù)為3}

擴展--數(shù)組的存儲

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

#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個字節(jié),可以判斷出三個地址兩兩相差都是4    printf("a[%d]=%d,address=%x/n", i, a[i], &a[i]);  }  /*當前輸出結(jié)果:  a[0] = 1, address = c9f95c  a[1] = 2, address = c9f960  a[2] = 3, address = c9f964*/}

我們看一下上面定義的數(shù)組在內(nèi)存中存儲結(jié)構(gòu)

再來看一下數(shù)組(注意不是數(shù)組的元素,是數(shù)組)作為參數(shù)傳遞的情況

#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]);  }  /*打印結(jié)果  a[0]=10  a[1]=2  */}

多維數(shù)組

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

#include <stdio.h>int main(){  int a[2][3];//2行3列,二維數(shù)組可以看成是一個特殊的一維數(shù)組,只是它的每一個元素又是一個一維數(shù)組  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]);    }  }  /*打印結(jié)果  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 } };  //由于數(shù)組的賦值順序是先從第一行第一列,再第一行第二列...然后第二行第一列...,所以我們也可以寫成如下形式  int c[2][3] = { 1, 2, 3, 4, 5, 6 };  //也可以只初始化部分數(shù)據(jù),其余元素默認為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]);    }  }  /*打印結(jié)果  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} };}

擴展--多維數(shù)組的存儲

以上面a數(shù)組為例,它在內(nèi)存中的結(jié)構(gòu)如下圖

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

a=a[0]=&a[0][0] a[1]=&a[1][0]

關于多維數(shù)組,其實可以以此類推,在此不再贅述。

字符串

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

//// 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); //結(jié)果:Kenshin,注意使用%s輸出字符串內(nèi)容,如果換成整形輸出格式其實輸出的是a的地址  printf("/n");  printf("address=%x", a); //結(jié)果:address=5fbff890  printf("/n");  //后面的/0絕對不能省略,如果沒有/0則會出現(xiàn)如下情況  char b[] = { 'I', 'a', 'm'};  printf("%s",b); //沒有按照期望輸出,多了一些垃圾數(shù)據(jù),在當前環(huán)境打印結(jié)果:IamKenshin  printf("/n");  printf("address=%x",b); //結(jié)果:address=5fbff88d  printf("/n");  //直接賦值為字符串,此時不需要手動添加/0,編譯器會自動添加  char c[] = "Kenshin";  printf("c=%s",c); //結(jié)果:c=Kenshin  printf("/n");    //二維數(shù)組存儲多個字符串  char d[2][3]={"Kenshin","Kaoru","Rose","Jack","Tom","Jerry"};      return 0;}

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

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

擴展--字符串操作常用函數(shù)

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

//// 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'); //結(jié)果:a,putchar一次只能輸出一個字符  printf("/n");  putchar(97);//結(jié)果: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本身就代表了數(shù)組的地址  printf("c=%s/n",c);//注意即使你輸入的內(nèi)容大于10,也能正確輸出,但是下面的gets()函數(shù)卻不行  printf("/n");    //gets()函數(shù),注意它是不安全的,因為接收的時候不知道它的大小容易造成溢出,建議不要使用  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)); //結(jié)果是:2,不是3,因為/0不計入長度  printf("/n");  char f[]={"Kenshin"};  printf("%lu",strlen(f)); //結(jié)果是:7  printf("/n");    char g[5];  strcpy(g,"hello,world!");  printf("%s",g); //結(jié)果是:hello,即使定義的g長度為5,但是也能完全拷貝進去  printf("/n");  char h[5];  char i[]={'a','b','c','/0','d','e','f','/0'};  strcpy(h,i);  printf("%s",h); //結(jié)果是:abc,遇到第一個/0則結(jié)束  printf("/n");    strcat(i,"ghi");  printf("%s",i); //結(jié)果是:abcghi,注意不是abcdefghi,strcat,從i第一/0開始使用“ghi”覆蓋,覆蓋完之后加上一個/0,在內(nèi)存中目前應該是:{'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則返回兩者前后之差,結(jié)果:32,-33,99  printf("/n");  return 0;}

注意在Xcode中會提示gets是不安全的,因為Xcode使用的是gcc編譯器,在gcc編譯器中已經(jīng)不能正確編譯gets()函數(shù),推薦使用fgets()。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 免费a级作爱片免费观看欧洲 | 爱高潮www亚洲精品 欧美黄色一级片视频 | 黄色网址进入 | 一级做受毛片免费大片 | 日韩伦理电影免费观看 | 欧美一级黄色免费 | 日韩高清影视 | 精品国产欧美一区二区 | 久久一本日日摸夜夜添 | 免费男女视频 | 55夜色66夜色国产精品视频 | 久久久久久亚洲综合影院红桃 | 久久久久久久亚洲视频 | 免费看黄色一级大片 | 国产亚洲精品久久久久婷婷瑜伽 | 久久17| 国产高潮失禁喷水爽到抽搐视频 | 日韩精品免费一区二区三区 | 九九精品在线观看 | 日本在线播放一区二区 | 黄色网址进入 | 717影院理论午夜伦八戒秦先生 | 九九热免费视频在线观看 | 午夜久久久久 | 婷婷中文字幕一区二区三区 | av在线观| 一起草av在线 | 亚洲成人免费视频在线 | 黄色18网站 | 九九热这里只有精品8 | 久久精品亚洲国产奇米99 | 97久久日一线二线三线 | 久久久久久久久久亚洲精品 | chinesehdxxxx无套 久久另类视频 | 毛片av网| 久久亚洲精品国产一区 | 久久久久久久爱 | 九九视屏 | 国产91精品欧美 | 最新se94se在线欧美 | 亚洲成人欧美在线 |