黑馬程式設計師—C語言筆記—陣列和字串
一、陣列
1、概念:是用來儲存一組資料的;
a、構造型別:有無數個基本資料型別組成的型別;
b、特點:(1)、只能存放一種型別的資料;(2)、裡面存放的資料稱為“元素”;
2、陣列的定義
a、定義格式: 資料型別 陣列名[元素個數];
b、簡單使用:
(1)、簡單的初始化;int age[3] = {11, 12, 13};
(2)、元素有順序之分,每個元素都有一個唯一的下標(索引index),從0開始
(3)、陣列元素的訪問:a[i]
3、陣列遍歷:按順序檢視陣列的每個元素
#include <stdio.h>
int main()
{
int age[3] = {11, 12, 13};
for(int i = 0; i <3;i++)
{
printf(“age[%d] = %d\n”, i, age[i]);
}
return 0;
}
4、初始化寫法:
a、只能在定義陣列的同時進行初始化,定義初始化時陣列元素個數只能是常量。
int a[3]={1,2,3};
int a[3]={1};
int a[3]={ [0]=1,[2]= 2};
int a[]={1,2,3};
int a[‘A’]={1,2,3};
b、錯誤寫法:
int a[]; int[] a; a={1,2,3}; a[3]={1,2,3}; // 只能在定義陣列的同時進行初始化
int count=3;
int a[count]={1,2,3};// 這是錯誤的,如果想在定義陣列的同時進行初始化,陣列元素個數必須是常量,或不寫
int a[count];// 這是可以的,但未定義的陣列元素的值是不確定的,定義陣列過程中並沒有進行初始化,陣列元素個數可以是變數。
a[0]=1;
;
5、計算陣列的長度(計算陣列元素的個數)
int a[]={1,2,3};
int count = sizeof(a)/sizeof(a[0]);
6、陣列的記憶體儲存細節
a、儲存空間的劃分:記憶體的分配是從高地址到低地址進行的,但一個數組內部元素又是從低到高進行的;
b、陣列名就代表陣列的地址;
列印每個元素的地址
#include <stdio.h>
int main()
{
int a[3] = {23,53,3};
for(int i =0;i<3;i++)
{
printf(“a[%d]的地址是:%p\n”,i,&a[i]);
}
return 0;
}
7、陣列和函式
a、陣列作為函式的引數,可以省略元素個數
b、陣列作為函式引數,是進行地址傳遞,傳遞的是整個陣列的地址,修改函式形引數組元素的值,會影響到外面的實引數組。
c、陣列當作函式引數傳遞時,會當做指標變數來使用,指標變數在64bit編譯器環境下佔據8個位元組
void change(int arr[])
{
int size = sizeof(arr);//這個計算的不是陣列的字元長度,而是地址型別的長度
printf(“傳遞引數後的長度:%d”,size);
}
int main()
{
int a[]={1,2,3,4,5,6};
Change(a);
return 0;
}
8、例項練習:
設計一個函式:將一維整型陣列中的元素逆序存放。比如本來是1,3,4,2,逆序存放就變成了:2,4,3,1
#include <stdio.h>
int main()
{
int a[]={4,6,2,23,42,4,53};
int length = sizeof(a)/sizeof(a[0]);
void arrayChange(int arr[], int length);
arrayChange(a,length);
printf("一維整型陣列中的元素逆序存放的結果是\n");
for (int i=0; i<length; i++) {
printf(“%d\n”,a[]);
}
return 0;
}
void arrayChange(int arr[],int length)
{
int temp;
for(int i=0; i<length/2; i++)
{
temp=arr[ i ];
arr[ i ]=arr[length-1-i];
arr[length-1-i]=chan;
}
}
9、二維陣列:是一個特殊的一維陣列,他的陣列元素是一維陣列
a、a[2][3]可以看作由一維陣列a[0]和一維陣列a[1]組成,這兩個一維陣列都包含了3個int型別的元素,記憶體儲存細節如下:
b、二維陣列初始化
int ages2[3][5]= {
{10, 11, 90, 89, 70},
{11, 12, 91, 90, 71},
{12, 13, 92, 91, 72}
};二、字串
1、概念:是很多字元組合在一起形成的字串例:"jack"
a、初始化:
char name[8]="jack";
char name1[8]={'j', 'a', 'c', 'k', '\0'};
char name2[8]={'j', 'a', 'c', 'k', 0};
char name3[8]={'j', 'a', 'c', 'k'};// 可以看作是隱藏了’\0’;
char name4[]={'j', 'a', 'c', 'k'};// 這個不算是一個字串,只能說是一個字元陣列
b、輸出: %s
printf("字串輸出:%s\n",name);
2、'\0'的作用:字串結束的標誌
%s是從輸出的變數的地址開始一個一個的輸出字元,直到遇到’\0’為止;例:
#include <stdio.h>
int main()
{
char user[]="hello";
char name[]={'o', 'k' };
printf("%s\n",name);//從name地址開始輸出,結果是okhello;
return 0;
}
3、常用字串處理函式
strlen();//計算字串長度。
#include <stdio.h>
#include <string.h>
int main()
{
char user[]="hello你好";
int length = strlen(user);
printf("%d\n", length);//結果是11
return 0;
}
a、計算的是字元數,不是字數;
b、計算的字元不包括’\0’;
c、從某個地址開始數字符的個數,直到遇到’\0’為止
4、printf與sizeof
a、printf函式返回的字串常量的字元數,並不是字數
b、sizeof用來計算一個變數或者一個常量所佔的記憶體位元組數。
5、字串陣列
使用場合:儲存多個字串,如儲存3個人的名字:
char name[3][15]={"jack", "rose", "jim"};