IOS學習筆記
概述:
8_2、改變整型變量的符號
8_2、改變整型變量所占存儲空間
8_3、char類型數據存儲
8_4、數組的基本概念及分類
8_5、數組元素作為函數參數
8_5、一維數組定義及注意事項
8_6、一維數組初始化
8_7、一維數組一個讓人疑惑的問題
8_8、一維數組的引用
8_9、應用:數組遍歷
8_10、一維數組的存儲方式
8_11、一維數組的地址
8_12、一維數組長度計算方法
8_13、一維數組的越界問題
8_14、應用:找最大值
8_15、數組元素作為函數參數
8_16、數組名作為函數參數
8_17、數組名作為函數參數的注意點
8_17、數組名作為函數參數的注意點-補充
8_18、冒泡排序的思想
8_18、冒泡排序的思想-補充
8_19、冒泡排序代碼實現
整形變量修飾符介紹(修飾符包括:int short long 【long long】 signed unsigned)
1、改變整形變量所占存儲空間
short 2個字節 輸出用%hd short int a=4;-->占有兩個字節 printf("%hd/n",變量名);
例如:short int a=1;
short int a1=a<<15; //讓a左移15位,最小的負數
a1=(a<<15)-1; //左移15位,最大的正數
printf("d%/n",a1);
short 修飾的int占兩個字節,共占16位
表示的范圍是:
10000000 00000000 -->最小的負數 -32768
01111111 11111111 -->最大的正數 32767
int 4個字節 輸出用%d 或者 %i -->占有四個字節
例如:int b=1;
int b1=b<<31;
b1=(b<<31)-1; //左移31位
printf("d%/n",b1);
表示的范圍是:
10000000 00000000 00000000 00000000 -->最小的負數 -2147483648
01111111 11111111 11111111 11111111 -->最大的正數 2147483647
long 8個字節 輸出用%ld -->占有八個字節
例如:long int c=1;
long int c1=c<<63; //左移63位
c1=(c<<63)-1;
printf("c1 = ld%/n",c1);
表示的范圍是:
10000000 00000000 00000000 00000000 ... 00000000 (共64位) -->最小的負數 -9223372036854775808
01111111 11111111 11111111 11111111 ... 11111111 (共64位) -->最大的正數 9223372036854775807
long long 8個字節 輸出用lld%(主要是為了解決32位機器問題)-->占有八個字節
注意:所有修飾符都是用來修飾整形變量的。
* long long類型
在32位系統下:
long 占4個字節(改變整形變量的存儲空間)
long long 占8個字節
在64位系統下:
long 占8個字節
long long 占8個字節
2、改變整形變量的符號
signed 表示是有符號的(計算機默認是有符號的)
unsigned 表示是一個無符號的數(改變整形變量的符號,正數的取值范圍會擴大一倍。) 輸出用u% printf("u%/n",變量名);
3、char類型數據存儲
1)char 型常量的存儲問題
sizeof('a')
-->先找到'a'的ASCII碼值 -->97
-->把 97 按照int類型進行 -->00000000 00000000 00000000 01100001
char ch='a'
-->97
-->把97轉換為 2 進制 01100001 一個字節
-->把一個字節存儲到內存中
總結:char類型的常量和變量的存儲方式是不一樣的。(注:在Xcode環境下。如果在其他環境下可能一樣)
一個字節的范圍:0--127 用做常見的字符的ASCII碼
4、數組的基本概念以及分類
1)基本概念:
在程序設計中,為了數據處理方便,我們把具有相同類型的若干變量按照有序的形式組織起來,這些按序排列的同類數據元素的集合稱為數組。
在 C 語言中,數組屬於構造數據類型。一個數組可以分解為多個數組元素,這些數組元素可以是基本類型或者是構造類型。
2)數組的幾個名詞:
什麼是數組:一組具有相同數據類型的數據的有序集合。
數組元素:構成數組的數據。數組中的每一個數組元素具有相同的名稱,不同的下標,可以作為單個變量使用,所以也稱為下標變量。
數組的下標:就是數組元素的位置的一個索引或指示。
數組的維數:就是數組下標的個數。數據數組的維數可以將數組分為一維數組、二維數組、三維數組、多維數組。
按存儲的內容分類:按數組元素的類型不同,數組又分為:
數值數組:用來存儲數組
字符數組:用來存儲字符
指針數組:用來存放指針(地址)
結構數組:用來存放一個結構體類型的數據
按照維度分類:
一維數組:
二維數組:
三維數組:
多維數組:
5、數組元素作為函數參數
1)數組可以作為函數的參數使用,進行數據的傳遞。
a、一種是把數組元素(下標變量)作為實參使用;
數組元素就是下標變量,它與普通變量並沒有區別。因此它作為函數實參使用與普通變量時完全相同的,在發生函數調用時,把作為實參的數組元素的值傳遞給形參,實現單向的值傳遞。
b、一種是把數組名作為函數的形參和實參使用。
6、一維數組的定義以及注意事項
1)一維數組的介紹:
如果一個數組的所有元素都是基本數據類型,那麼該數組稱為一維數組
2)一維數組的定義
在C語言中使用數組必須先進行定義。一維數組的定義方式:
類型說明符 數組名[常量表達式]
a、類型說明符:是任一種基本數據類型或構造數據類型。
b、數組名:用戶定義的數組標示符。
c、方括號中的常量表達式:表示數據元素的個數,也稱為數組的長度。
例如:int a[10]; //定義整形數組a,有10個元素
float b[10],c[20]; //定義實型數組b,有10個元素,定義實型數組c,有20個元素。
注意:a、數組的長度可以是一個常量,也可以是常量表達式。
b、數組的命名規則:嚴格按照標示符的命名規范。
c、數組名稱不能和其他變量同名。
d、數組的長度不可以為一個變量(C99標准要求的)
e、數組的長度可以使用 宏定義(#define M 5 int a[M] -->此時M是一個宏定義)
f、定義數組的時候,還可以定義普通變量。(如:int x,y,z[9];)
3)一維數組的初始化:
數組初始化賦值是指在數組定義時給數組賦予初值。數組初始化是在編譯階段進行的。這將減少運行時間,提高效率。
初始化方式有兩種:
a、定義的同時初始化
例如:
類型說明符 數組名[常量表達式]={值1,值2,值3...值n};
實例:int a[3]={1,4,2}; //長度由[]中的值決定的
int b[]={2,5,7,6}; //長度是由{}中的值的個數決定的
int c[10]={[3]=23,[8]=34};//定義長度為10的數組,下標為3的元素的值為23,下標為8的數組元素為34
b、先定義、後初始化
類型說明符 數組名[常量表達式];
數組名[0]=值;
數組名[1]=值;
數組名[2]=值;
實例:int d[10];
d[0]=1;//為下標為0的數組元素賦值為1;即數組的第一個元素值為1;
d[1]=2;//為下標為1的數組元素賦值為2;即數組的第二個元素值為2;
d[2]=3;//為下標為2的數組元素賦值為3;即數組的第三個元素值為3;
...
d[9]=100;//為下標為9的數組元素賦值為100;即數組的第十個元素值為100;
4)一維數組中讓人疑惑的問題:
數組如果沒有初始化,數組中到底有沒有值?如果有,值是多少?如果數組部分進行了初始化,那麼沒有初始化的那些元素有沒有值,如果有,值是多少?
a、數組如果沒有初始化,數組中的元素是有值的。值是垃圾值。
b、如果數組部分進行了初始化,那麼沒有初始化的那些元素有值,如果有,值是0。
c、如果是字符數組進行了部分初始化,那麼沒有初始化的部分也有值,值為ASCII碼對應的默認值。
5)一維數組的引用方式
數組元素是組成數組的基本單元。數組元素也是一種變量,其標識方式是數組名後跟一個下標。下標表示了元素在數組中的順序號。
特別強調:使用先定義後初始化的方式,如果部分數組元素被初始化了,系統不會對沒有初始化的那部分元素進行賦值0的操作。
6)一維數組的存儲方式
存儲方式:
a、計算機會給數組分配一塊連續的存儲空間;
b、數組名代表數組的首地址,從首地址位置,依次存入數組的第一個、第二個、...、第n個元素;
c、每個元素占用相同的字節數(取決於數據類型)
d、並且元素之間的地址是連續的。
7)一維數組的地址
一維數組的地址:
a、數組內部的元素地址是連續的;
b、數組名存放的是數組的首地址-->數組的首地址:數組的第一個元素首地址(第一個元素的第一個字節的地址)
c、補充:數組名==&數組名[0]; 數組名是一個常量 存儲的就是數組的首地址
d、數組的每個元素的地址
8)一維數組長度計算方法
a、因為數組在內存中占用的字符數取決於其存儲的數據類型和數據個數
b、數組在內存中占用的總字節數:sizeof(數組名);
c、計算數組長度的方法:
數組的長度=數組占用的總字節數/數組元素占用的字節數
例如:int a[]={1,5,3,2,7,4,9,23,46,47,36};
int a_len=sizeof(a)/sizeof(int);
9)一維數組的越界問題
數組下標越界是不安全的,因為這個空間不屬於你。可能會有數據丟失現象發生。
10)應用:找最大值
//通過for循環,從鍵盤獲取10個數,存放到數組中。找出10個數中的最大值
void main(){
int a[10];
//循環接收用戶輸入
for(int i=0;i<10;i++){
printf("請輸入第%d個數/n",i+1);
//接收數據,保存到數組中
scanf("%d",&a[i]]);
}
//遍歷數組,輸出看看輸入的10個值
for(int i=0;i<10;i++){
printf("%d/t",a[i]);
}
//找出最大值
int max=a[0];
for(int i=0;i<10;i++){
if(max max=a[i];
}
}
printf("輸入的最大值為:%d/n",max);
}
11)數組名作為函數參數
a、用數組元素作為函數參數不要求形參也必須是數組元素,但是用數組名作為函數參數時,則要求形參和相對應的實參都必須是類型相同的數組。
b、在C語言中,數組名除作為變量的標示符之外,數組名還代表了該數組在內存中的起始地址,因此,當數組名作為函數參數時,實參與形參之間不是“值傳遞”,而是“地址傳遞”,實參數組名將該數組的起始地址傳遞給形參數組,兩個數組共享一段內存單元,編譯系統不再為形參數組分配存儲單元。
c、在變量作為函數參數時,所進行的值傳遞是單向的。即只能從實參傳向形參,不能從形參傳回實參。形參的初值和實參相同,而形參的值發生改變後,實參並不變化,兩者的終值是不同的。
12)數組名作為函數參數的注意點
a、形參數組和實參數組的類型必須一致,否則將引起錯誤;
b、形參數組和實參數組的長度可以不相同,因為在調用時,只傳送首地址而不檢查形參數組的長度。當形參數組的長度與實參數組不一致時,雖然不至於出現語法錯誤(編譯能通過),但程序執行結果將與實際不符,這是應該注意的。
c、在函數形參表中,允許不給出形參的長度,或用一個變量來表示數組元素的個數。例如,可以寫為:
void nzp(int a[]) 或者寫為: void nzp(int a[],int n)
其中行參數組a沒有給出長度,而由n值動態地表示數組的長度。n的值由主調函數的實參進行傳遞。
d、多維數組也可以作為函數的參數。在函數定義時對行參數組可以指定每一維的長度,也可以省去第一維的長度。因此,下面寫法都是合法的:
int MA(int a[3][10]) 或者: int MA(int a[][10])
13)數組名作為函數參數的注意點
a、C語言中規定,不管是什麼類型的數據,數據的內存地址在內存中占用8個字節
14)冒泡排序思想
冒泡排序(Bubble sort)是一種簡單的排序算法。
冒泡排序分為:
a、大數下沉
b、小數上浮
冒泡排序步驟:
a、比較相鄰的元素。如果第一個比第二個大,就交換他們的位置。
b、對每一對相鄰的元素做同樣的工作,從開始第一對到結尾最後一對。在這一點,最後的元素應該會是最大的數。
c、針對所有的元素重復以上的步驟,除了最後一個。
d、持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數組需要比較。
代碼實現:
void maoPao(int nums[],int len){
int temp;
for(int i=0;i
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
}
void main(){
int nums[10]={1,5,2,7,6,9,3,4,15,74};
printf("排序前:");
for(int i=0;i<10;i++){
printf("%d/t",nums[i]);
}
maoPao(nums,10);
printf("排序後:");
for(int i=0;i<10;i++){
printf("%d/t",nums[i]);
}
}