文章目錄
- 1.除了形參使用陣列或者指標,通過全域變數也能做到把函式處理結果的二個資料回傳給主調函式,
- 2.宣告陣列時不能用常變數,參考陣列的時候大膽用常變數,
- 3.陣列初始化的幾組實體:
- 4.陣列是相同型別的一段連續的空間,下標是從0開始的,
- 5.區分strlen與sizeof,看看下面代碼具體結果:
- 6.對于二維陣列int array[M][N], 說明如下:
- 7.二維陣列在記憶體中是連續存盤的
- 8.冒泡排序
- 9.陣列名是什么?
1.除了形參使用陣列或者指標,通過全域變數也能做到把函式處理結果的二個資料回傳給主調函式,
決議:
全域變數在函式當中被改變,自然主調函式內他的值也變了,但不建議這樣使用!
//1.陣列
void test(int arr[])
{
arr[0] = 1;
arr[1] = 2;
}
int main()
{
int arr[10] = { 0 };
test(arr);
return 0;
}
//2.指標
void test(int*p1, int *p2)
{
*p1 = 1;
*p2 = 2;
}
int main()
{
int a = 0;
int b = 0;
test(&a, &b);
return 0;
}
//3.全域變數
int a;
int b;
void test()
{
a = 1;
b = 2;
}
int a = 0;
int b = 0;
int main()
{
test();
return 0;
}
2.宣告陣列時不能用常變數,參考陣列的時候大膽用常變數,
陣列定義宣告時不建議用常變數,編譯器會報錯;參考陣列時大膽用常變數
//X定義宣告時不建議用常變數,會報錯
int n=1;
int arr[n]={0};
//√參考時大膽用常變數
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
3.陣列初始化的幾組實體:
int型陣列自動補充0;char型陣列自動補充\0
//一樣的效果
int arr2[] = { 1,2,3,4,5 };
int arr2[5] = { 1,2,3,4,5 };
//ch1是bit00,ch2是bit
char ch1[5] = {'b', 'i', 't'};
char ch2[] = { 'b', 'i', 't' };
//ch3是b i t \0 0,ch4是b i t \0
char ch3[5] = "bit";
char ch4[] = "bit";
//ch5是b i t \0,ch6是b i t,前者字串長度4,后者長度3
char ch5[] = "bit";//這里會補\0
char ch6[] = { 'b', 'i', 't' };
4.陣列是相同型別的一段連續的空間,下標是從0開始的,
比如:int array[N],下標的范圍為[0,N),其中N位置不能存盤有效元素,
具體實體:定義了一維 int 型陣列 a[10] 后,參考a[10] = 2會越界,
5.區分strlen與sizeof,看看下面代碼具體結果:
#include <stdio.h>
int main()
{
char str[] = "hello bit";
printf("%d %d\n", sizeof(str), strlen(str));
return 0;
}
決議:str字符陣列使用"hello bit"初始化,最終也會將’\0’放置到陣列中,因此陣列中總共有10個元素,
? sizeof(str):獲取陣列的總大小,10個元素,每個元素占1個位元組,因此總共是10個位元組,
? strlen(str): 獲取字串中有效字符的個數,不算’\0’,因此總共9個有效字符,
? 故上述printf會分別列印:10 9
6.對于二維陣列int array[M][N], 說明如下:
1.M和N都必須為常數,
2.M代表陣列有M行,N代表每行中有N個元素
3.其中M可以省略,省略后必須給出初始化運算式,編譯器從初始化結果中推斷陣列有多少行
4.N一定不能省略,因為N省略了就不能確定一行有多少個元素,也不能確定陣列有多少行

7.二維陣列在記憶體中是連續存盤的
int arr[][4] = { {1,2}, {3,4} ,{4,5} };
int i = 0;
int j = 0;
int* p = &arr[0][0];
for (i = 0; i < 12; i++)//按順序輸出陣列內12個元素
{
printf("%d ", *p);
p++;
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}

可以觀察到倆個for回圈的結果,第一個for回圈先逐列輸出,再換行繼續;第二個for回圈結果可知每個元素地址差為4.
8.冒泡排序
flag是為了盡可能減少計算,不加flag計算量可能會大些,
void bubble_sort(int arr[], int sz)//形參arr本質是指標
{
//確定趟數
int i = 0;
for (i = 0; i < sz - 1; i++)
{
//一趟冒泡排序的程序
int j = 0;
int flag = 1;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
//交換
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;
}
}
if (flag == 1)
{
break;
}
}
}
int main()
{
//int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
//排序為升序 - 冒泡排序
//計算陣列元素個數
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);//陣列傳參的時候,傳遞的其實是陣列首元素的地址
return 0;
}
9.陣列名是什么?
陣列名是陣列首元素的地址,但是有2個例外 :
- sizeof(陣列名) - 陣列名表示整個陣列 - 計算的是整個陣列的大小,單位是位元組
- &陣列名 - 陣列名表示整個陣列 - 取出的是整個陣列的地址
int arr[10] = { 0 };
printf("%p\n", &arr);//&arr取出的是整個陣列的地址
printf("%p\n", &arr+1);//可以看到地址加了40,加了整個陣列的地址,
printf("%p\n", arr);//取出的是陣列的首地址
printf("%p\n", arr+1);//可以看到地址加了4,加了陣列一個元素的地址大小,

int sz = sizeof(arr);//陣列名表示整個陣列
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/279848.html
標籤:其他
下一篇:資料結構秘籍之鏈表
