注:通過(guò)xshell實(shí)現(xiàn)對(duì)liunx系統(tǒng)等的遠(yuǎn)程鏈接
c語(yǔ)言數(shù)組
1.
一維數(shù)組的初始化和遍歷
初始化的方法:
①全部初始化 //例 int a[8]={1,2,3,4,5,6,7,8};
②局部初始化 // 例: int a[10]={0,1,2,3,4,5,6,7}
③全部初始化不指定下標(biāo),系統(tǒng)根據(jù)元素個(gè)數(shù)自動(dòng)確定大小 // 例: int a[]={1,2,3,4,5,6,7,8,9} 則相當(dāng)于a[9]
注:局部初始化沒(méi)有賦值的元素自動(dòng)賦值為0
數(shù)組大小等于 數(shù)組內(nèi)元素個(gè)數(shù)*數(shù)組類(lèi)型
數(shù)組內(nèi)元素個(gè)數(shù)=數(shù)組大小/數(shù)組第一個(gè)元素 (變相求個(gè)數(shù),通過(guò)sizeof實(shí)現(xiàn))
如果在數(shù)組內(nèi)部定義一個(gè)數(shù)組不去初始化,那么每一個(gè)元素都是初始值
int a[5]={0}; 相當(dāng)于把a(bǔ)中的五個(gè)元素全部定義為0
一維數(shù)組的遍歷
for(i=0;i<sizeof(數(shù)組名)/sizeof(數(shù)組里第一個(gè)元素如a[1]);i++)
printf("%d ",a[i]);
for循環(huán)遍歷
sizeof求數(shù)組大小
putchar(10):向終端輸出一個(gè)ASCII碼為10的字符,換行
注意:數(shù)組序數(shù)從0開(kāi)始,所以最大編號(hào)為n-1,即a[10]第一個(gè)元素為a[0],最后一個(gè)元素為a[9]
排序:
冒泡排序
別名交換排序,從一邊開(kāi)始從小到大或者從大到小比較,滿(mǎn)足規(guī)則就進(jìn)行交換,(規(guī)則基本上為大于或小于)
需要兩個(gè)for循環(huán)
for 大循環(huán),控制整體比較多少次
for 小循環(huán),控制本次比較中,進(jìn)行多少次比較/交換
循環(huán)內(nèi)部:一個(gè)數(shù)比它后一個(gè)數(shù)大/小時(shí),交換可以選擇新建一個(gè)元素n暫時(shí)存放數(shù)據(jù),或者見(jiàn)下
sizeof(數(shù)組名)/sizeof(數(shù)組名[第一個(gè)元素])

二維數(shù)組:
存儲(chǔ)類(lèi)型,數(shù)據(jù)類(lèi)型,數(shù)組名,下標(biāo)兩個(gè)[行數(shù)][列數(shù)]
命名規(guī)則:
int a[3][4];
遍歷需要兩個(gè)for循環(huán)
外循環(huán)控制行數(shù) ,內(nèi)循環(huán)控制列數(shù)
按行存儲(chǔ),沒(méi)有初始化的自動(dòng)補(bǔ)0
相當(dāng)于n個(gè)行的集合
列數(shù)必須寫(xiě),行數(shù)可以不寫(xiě)
不寫(xiě)行數(shù)計(jì)算機(jī)會(huì)想辦法自動(dòng)識(shí)別,不寫(xiě)列數(shù)計(jì)算機(jī)無(wú)法判斷到底有幾行
遍歷循環(huán)外層控制行數(shù),內(nèi)層控制列數(shù)
三:字符數(shù)組,字符串
字符串本質(zhì)也是一個(gè)字符數(shù)組
字符數(shù)組:數(shù)組里每一個(gè)元素都是字符
字符串的逆序:
實(shí)現(xiàn)原理如下:

向一個(gè)字符串插入數(shù)據(jù):

指針對(duì)字符串的處理
字符串函數(shù)(系統(tǒng)提供的)
①: 為什么要是使用字符串函數(shù)
一般字符串都保存在一個(gè)數(shù)組里面,但數(shù)組定義好之后,無(wú)法直接進(jìn)行整體操作,所以會(huì)借助字符串函數(shù)來(lái)對(duì)字符數(shù)組進(jìn)行操作
直接用數(shù)組名,相當(dāng)于使用數(shù)組首地址
而不是使用內(nèi)容
數(shù)組如果沒(méi)有初始化,就必須寫(xiě)下標(biāo)指定大小
常用字符串函數(shù)
strlen man strlen
頭文件 string.h 字符串處理函數(shù)常用頭文件
原型 size_t strlen(const char *s);
功能 獲取一個(gè)字符的長(zhǎng)度
參數(shù) s:要獲取長(zhǎng)度的字符串
直接傳入一個(gè)字符串或者數(shù)組名均可
只獲取字符串長(zhǎng)度,遇到\0就停止,\0不計(jì)入內(nèi)
但sizeof會(huì)計(jì)算字符串的\0
sizeof和strlen的區(qū)別:
sizeof主要用來(lái)內(nèi)存空間分配大小,是關(guān)鍵詞,標(biāo)識(shí)符,
strlen僅用來(lái)看字符串長(zhǎng)度,是一個(gè)庫(kù)函數(shù)
一個(gè)側(cè)重長(zhǎng)度,一個(gè)側(cè)重空間
返回值: 字符串長(zhǎng)度
②strcmp
頭文件:同上
原型:int strcmp(const char *s1,const *s2);
功能:比較兩個(gè)字符串的內(nèi)容,大小,
參數(shù)為要比較的兩個(gè)字符串
只是對(duì)兩個(gè)字符串進(jìn)行比較然后返回值,不對(duì)字符串內(nèi)容做修改
返回值:
0 s1和s2相等
>0 s1大于s2,返回多少說(shuō)明s1和s2第一個(gè)不相同的字符差值是多少,<0的也是
<0 s1小于s2
strcmp比較的是\0之前的內(nèi)容,與字符串所在內(nèi)存空間無(wú)關(guān)
一直比較,直到遇見(jiàn)不相同的,比較該位后立即停止,后面的不進(jìn)行繼續(xù)比較
如果兩個(gè)字符串前面的相同,后面的一個(gè)沒(méi)了,那么會(huì)拿\0和另一個(gè)字符串比較
strncmp : 比較字符串前n個(gè)字節(jié)大小
strncmp(數(shù)組1,數(shù)組2,n的值) strcmp(a1,a2,4)即為比較a1和a2前4個(gè)字符大小
strcpy:
復(fù)制函數(shù)
頭文件同上
char *strcpy(char *dest,const char *src);
strcpy(字符串1,字符串2)
將字符串2 的內(nèi)容拷貝到字符串1 中
返回值為目的字符串的首地址,
字符串1里面就算有內(nèi)容也會(huì)被覆蓋,原字符串比復(fù)制過(guò)來(lái)的長(zhǎng)也會(huì)被覆蓋,后面的不會(huì)繼續(xù)顯示,(\0也會(huì)過(guò)來(lái))
strncpy(只拷貝字符串2的前n位到字符串1中),但是這樣的沒(méi)有\(zhòng)0,如果字符串1原長(zhǎng)度比n長(zhǎng),仍然會(huì)顯示后面的內(nèi)容
strcat()函數(shù)
頭文件同上
把字符串2粘到字符串1后面,需要s1足夠長(zhǎng)
粘貼字符串2中的內(nèi)容直到遇到第一個(gè)\0
遇見(jiàn)s1中第一個(gè)\0后開(kāi)始拼接,也就是說(shuō)字符串1和字符串2第一個(gè)\0后面的內(nèi)容都無(wú)法顯示
但用for循環(huán)可以遍歷出來(lái)字符串1后面的內(nèi)容
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char s1[32] ="hello wo\0rldadadjajdalsdkjaskdj"; //hello woabcdefg\0
char s2[32] ="abcdefg\0higk";
strcat(s1,s2);
printf("s1 = %s\n",s1);
return 0;
}
strcpy手動(dòng)實(shí)現(xiàn):
原理:循環(huán)拷貝,依次裝填
指 針
用途:
使用程序緊湊高效
可以有效表達(dá)數(shù)據(jù)結(jié)構(gòu)
用來(lái)動(dòng)態(tài)分配內(nèi)存
得到多于一個(gè)函數(shù)返回值
概念:
當(dāng)程序中定義一個(gè)變量之后,程序就會(huì)為這個(gè)變量分配內(nèi)存空間,我們內(nèi)存空間中每一個(gè)字節(jié)都有自己的編號(hào),將這個(gè)編號(hào)稱(chēng)之為地址,也叫作指針
在不影響理解的情況下,有時(shí)對(duì)地址,指針,指針變量不區(qū)分,統(tǒng)稱(chēng)指針,
最終目的:找到需要的變量
如果前面是一種類(lèi)型,表示這是一條定義語(yǔ)句,定義一個(gè)指針變量
*pa=&a
地址在32位操作系統(tǒng)中占4個(gè)字節(jié),64位占8個(gè)字節(jié),不論什么類(lèi)型的指針,指向所指向的地址
在使用時(shí),*pa=100;
表示取指,取指針pa指向的內(nèi)存的值
-m32 以32位編譯輸出(gcc語(yǔ)句最后面加)
不同類(lèi)型的指針,步長(zhǎng)不一樣

指針變量的運(yùn)算:
是以指針變量所存的地址量作為運(yùn)算量而進(jìn)行運(yùn)算的
實(shí)質(zhì)就是地址的運(yùn)算
只能進(jìn)行算數(shù)運(yùn)算,關(guān)系運(yùn)算,賦值運(yùn)算
指針變量加減表示指針變量向地址大或小的方向進(jìn)行移動(dòng),移動(dòng)n個(gè)操作空間
指針?biāo)銛?shù)運(yùn)算符:

兩個(gè)指針相減表示兩個(gè)地址之間的操作空間(也就是幾個(gè)元素)
注:兩個(gè)指針做運(yùn)算必須是同類(lèi)型指針,類(lèi)型不同,無(wú)意義
一個(gè)指針變量加減意義,乘除無(wú)法計(jì)算,沒(méi)有意義
后置++優(yōu)先級(jí)高于前置++
后置的結(jié)合律從左往右,
前置和*優(yōu)先級(jí)相同,結(jié)合律從右往左
關(guān)系運(yùn)算符:
< > >= <= != --
兩個(gè)指針變量可以通過(guò)通過(guò)關(guān)系運(yùn)算符來(lái)判斷保存地址的大小
指向兩個(gè)不同數(shù)據(jù)區(qū)域的數(shù)據(jù)兩個(gè)指針之間進(jìn)行關(guān)系運(yùn)算,也沒(méi)有意義
指針與一般整數(shù)變量之間的關(guān)系運(yùn)算,也沒(méi)有意義
但是可以和0去比較是否相等
判斷指針是否為空,一般會(huì)讓其與NULL相與
指向地址大的指針大于指向地址小的指針
6.2.3 賦值運(yùn)算符
指針變量之間可以直接賦值,但是不能將一個(gè)整數(shù)賦值給指針變量,因?yàn)闆](méi)有開(kāi)辟空間
指針賦值運(yùn)算:通過(guò)賦值運(yùn)算符將指針變量送一個(gè)地址值
例:
輸入一個(gè)字符串,通過(guò)指針將字符串元素翻轉(zhuǎn)
要求:定義兩個(gè)指針,分別保存起始位置和末尾位置字符,通過(guò)交換的方式實(shí)現(xiàn)
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
int a[5] = {1,2,3,4,5};
int *p = a;
int i;
for(i = 0 ; i < 5;i++)
{
//printf("%d ",a[i]);
printf("%d ",*(p+i));
}
putchar(10);
char *s = "helloworld";
char str[32] ="hello nanjing";
s = str;
//printf("%s\n",s);
for(i = 0 ; i < 10;i++)
{
printf("%c",s[i]);
}
putchar(10);
return 0;
}
浙公網(wǎng)安備 33010602011771號(hào)