pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

IOS開發之路--C語言數組和字符串

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

概覽

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

一維數組 多維數組 字符串

一維數組

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


#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*/
}

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

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


#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數組為例,它在內存中的結構如下圖

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

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

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

字符串

在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在內存中的存儲。

從圖中我們不難發現由于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;
}

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

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

在第一節中我們就提到C語言的構造類型,分為:數組、結構體、枚舉、共用體,當然前面數組的內容已經說了很多了,這一節將會重點說一下其他三種類型。
只有你完全了解每個變量或函數存儲方式、作用范圍和銷毀時間才可能正確的使用這門語言。今天將著重介紹C語言中變量作用范圍、存儲方式、生命周期、作用域和可訪問性。
由于預處理指令是在編譯之前就進行了,因此很多時候它要比在程序運行時進行操作效率高。在C語言中包括三類預處理指令,今天將一一介紹:宏定義、條件編譯、文件包含
指針是C語言的精髓,但是很多初學者往往對于指針的概念并不深刻,以至于學完之后隨著時間的推移越來越模糊,感覺指針難以掌握,本文通過簡單的例子試圖將指針解釋清楚
當前移動開發的趨勢已經勢不可擋,這個系列希望淺談一下個人對IOS開發的一些見解,今天我們從最基礎的C語言開始,C語言部分我將分成幾個章節去說,今天我們簡單看一下C的一些基
這篇文章主要介紹了Objective-C封裝字符串存儲操作示例,需要的朋友可以參考下
主站蜘蛛池模板: 电镀标牌_电铸标牌_金属标贴_不锈钢标牌厂家_深圳市宝利丰精密科技有限公司 | 山东风淋室_201/304不锈钢风淋室净化设备厂家-盛之源风淋室厂家 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 合肥废气治理设备_安徽除尘设备_工业废气处理设备厂家-盈凯环保 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | 天津货架厂_穿梭车货架_重型仓储货架_阁楼货架定制-天津钢力仓储货架生产厂家_天津钢力智能仓储装备 | 红外光谱仪维修_二手红外光谱仪_红外压片机_红外附件-天津博精仪器 | 权威废金属|废塑料|废纸|废铜|废钢价格|再生资源回收行情报价中心-中废网 | 临沂招聘网_人才市场_招聘信息_求职招聘找工作请认准【马头商标】 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 微信聊天记录恢复_手机短信删除怎么恢复_通讯录恢复软件下载-快易数据恢复 | 大_小鼠elisa试剂盒-植物_人Elisa试剂盒-PCR荧光定量试剂盒-上海一研生物科技有限公司 | 电采暖锅炉_超低温空气源热泵_空气源热水器-鑫鲁禹电锅炉空气能热泵厂家 | 电镀整流器_微弧氧化电源_高频电解电源_微弧氧化设备厂家_深圳开瑞节能 | 地图标注-手机导航电子地图如何标注-房地产商场地图标记【DiTuBiaoZhu.net】 | 高压分散机(高压细胞破碎仪)百科-北京天恩瀚拓 | 山东PE给水管厂家,山东双壁波纹管,山东钢带增强波纹管,山东PE穿线管,山东PE农田灌溉管,山东MPP电力保护套管-山东德诺塑业有限公司 | 长沙中央空调维修,中央空调清洗维保,空气能热水工程,价格,公司就找维小保-湖南维小保环保科技有限公司 | 板框压滤机-隔膜压滤机配件生产厂家-陕西华星佳洋装备制造有限公司 | 撕碎机_轮胎破碎机_粉碎机_回收生产线厂家_东莞华达机械有限公司 | 安平县鑫川金属丝网制品有限公司,防风抑尘网,单峰防风抑尘,不锈钢防风抑尘网,铝板防风抑尘网,镀铝锌防风抑尘网 | 厂房出租_厂房出售_产业园区招商_工业地产&nbsp;-&nbsp;中工招商网 | 精雕机-火花机-精雕机 cnc-高速精雕机-电火花机-广东鼎拓机械科技有限公司 | RV减速机-蜗轮蜗杆减速机-洗车机减速机-减速机厂家-艾思捷 | 厂房出租_厂房出售_产业园区招商_工业地产&nbsp;-&nbsp;中工招商网 | 杭州火蝠电商_京东代运营_拼多多全托管代运营【天猫代运营】 | PVC地板|PVC塑胶地板|PVC地板厂家|地板胶|防静电地板-无锡腾方装饰材料有限公司-咨询热线:4008-798-128 | 船用烟火信号弹-CCS防汛救生圈-船用救生抛绳器(海威救生设备) | 浴室柜-浴室镜厂家-YINAISI · 意大利设计师品牌 | 咿耐斯 |-浙江台州市丰源卫浴有限公司 | 智慧农业|农业物联网|现代农业物联网-托普云农物联网官方网站 | 造价工程师网,考试时间查询,报名入口信息-网站首页 | 储气罐,真空罐,缓冲罐,隔膜气压罐厂家批发价格,空压机储气罐规格型号-上海申容压力容器集团有限公司 | 无线遥控更衣吊篮_IC卡更衣吊篮_电动更衣吊篮配件_煤矿更衣吊篮-力得电子 | 2025黄道吉日查询、吉时查询、老黄历查询平台- 黄道吉日查询网 | 雾度仪_雾度计_透光率雾度仪价格-三恩时(3nh)光电雾度仪厂家 | 常州翔天实验仪器厂-恒温振荡器-台式恒温振荡器-微量血液离心机 恒温恒湿箱(药品/保健品/食品/半导体/细菌)-兰贝石(北京)科技有限公司 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 新型游乐设备,360大摆锤游乐设备「诚信厂家」-山东方鑫游乐设备 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 冷水机,风冷冷水机,水冷冷水机,螺杆冷水机专业制造商-上海祝松机械有限公司 | 淄博不锈钢,淄博不锈钢管,淄博不锈钢板-山东振远合金科技有限公司 |