天天看點

【C語言】數組前言==一維數組==二維數組數組越界數組作為函數參數數組名最後

🌹作者:雲小逸

📝個人首頁:[雲小揚的首頁]

📝碼雲:雲小揚 (YunXiaoYang003) - Gitee.com

🤟motto:要敢于一個人默默的面對自己,==強大自己才是核心==。不要等到什麼都沒有了,才下定決心去做。種一顆樹,最好的時間是十年前,其次就是現在!學會自己和解,與過去和解,努力愛自己。==希望春天來之前,我們一起面朝大海,春暖花開==!🤟

👏專欄:C語言初階👏專欄:C語言進階👏專欄:資料結構和算法👏

👏專欄:C++初階---👏專欄:C++進階--👏專欄:Linux學習👏

(文章目錄)

前言

——————————————————————————————

首先先寫上幾句話:獻給堅持創作的我和點開這篇文章希望進步的你

躺平,才是對這個時代最大的辜負。

中國,就是這個世界上最欣欣向榮的國家。

經濟發展的四大要素(技術、人才、市場、資金),在中國自由流通。

打開招聘網站,有成千上萬的崗位等你投遞。

想當老闆的人們,恭喜你!辦理營業執照免費!

以前,你要租個店面才能營業。

如今,你注冊個閑魚就能賣貨。

你說,躺平是因為"沒有希望"。

我覺得,躺平恰恰是遠離了"饑寒交迫",走向了"好逸惡勞"。

躺平,就是對這個時代最大的辜負。

==一維數組==

1.一維數組的建立

數組是一組相同類型元素的集合

type_t   arr_name   [const_n];
//type_t 是指數組的元素類型
//const_n 是一個常量表達式,用來指定數組的大小
注:C99标準之前是不支援使用變量的,隻能是常量,
C99标準之後增加了變長數組的概念,允許數組的大小為變量,
如果使用變長數組,則要求編碼器支援C99标準,VS對C99支援不是很好。
           

數組的執行個體

//代碼1
int arr1[10];
//代碼2
int count = 10;
int arr2[count];//數組時候可以正常建立?
//代碼3
char arr3[10];
float arr4[1];
double arr5[20];
           

2.一維數組的初始化

數組的初始化是指,在建立數組的同時給數組的内容一些合理初始值(初始化)。

int arr[10]={1,2,3,4,5,6,7,8,9,10};
int arr1[10] = {1,2,3};//不完全初始化,剩餘元素預設初始化為0
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";
           

==sizeof:計算數組的大小(包含\0),任何例型大小均可以,操作符

strlen: 計算\0之前那的字元,僅僅計算字元串的長度,庫函數==

  1. 數組是使用下标來通路的,下标是從0開始。
  2. 數組的大小可以通過計算得到:sz=sizeof(arr)/sizeof(arr[0)

3.一維數組在記憶體中的存儲(==十六進制==)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	int arr[10] = { 0 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		printf("arr[%d]=%p\n",i, &arr [i]);
	}
	return 0;
}
           
【C語言】數組前言==一維數組==二維數組數組越界數組作為函數參數數組名最後

總結:1.一維數組在記憶體中是連續存放

2.随着下标增長,位址由高到低變化的

【C語言】數組前言==一維數組==二維數組數組越界數組作為函數參數數組名最後

二維數組

1.二維數組的建立和初始化

//數組初始化
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[][4] = {{2,3},{4,5}};//二維數組如果有初始化,行可以省略,列不能省略
           

二維數組中行可以省略,列不可以省略

2.二維數組在記憶體中的存儲

【C語言】數組前言==一維數組==二維數組數組越界數組作為函數參數數組名最後

總結:

1.二維數組在記憶體中是連續存放的

2.以一維數組的形式存放

【C語言】數組前言==一維數組==二維數組數組越界數組作為函數參數數組名最後

數組越界

數組的下标是有範圍限制的。

數組的下規定是從0開始的,如果數組有n個元素,最後一個元素的下标就是n-1。

是以數組的下标如果小于0,或者大于n-1,就是數組越界通路了,超出了數組合法空間的通路。

C語言本身是不做數組下标的越界檢查,編譯器也不一定報錯,但是編譯器不報錯,并不意味着程式就是正确的,

是以程式員寫代碼時,最好自己做越界的檢查。

【C語言】數組前言==一維數組==二維數組數組越界數組作為函數參數數組名最後

發生數組越界,将會發生兩種情況:

1.stack aroud the variable 'arr'was corrupted//編譯器儲存

2.0 1 2 3 4 5 6 7 8 9 -858993460//編譯器不報錯

數組作為函數參數

冒泡排序的錯誤設計

//冒泡排序的錯誤設計
#include<stdio.h>
void bubble_sort(int arr[])
{
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0, j = 0;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
int main(void)
{
	int arr[10] = { 3,4,8,9,6,7,10,1,2,5 };
	bubble_sort(arr);
	int i = 0;
	for (i = 0; i < 10; i++)
		printf("%d ", arr[i]);
	return 0;
}
           
【C語言】數組前言==一維數組==二維數組數組越界數組作為函數參數數組名最後

錯誤原因: 實際數組傳參傳遞的不是整個數組,而是首元素位址。

則void bubble_sort(int arr[])本質上是void bubble_sort(int arr);

是以sizeof(arr)為sizeof(int)等于4,故sz=1,是以不會發生預想結果**

冒泡排序的正确設計

改正:

1.将sz=sizeof(arr)/sizeof(arr[0])移到主函數

2.将函數調用修改為bubble_sort(arr,sz);

3.将函數參數改為(int *arr,int sz)

//冒泡排序的正确設計
#include<stdio.h>
void bubble_sort(int arr[],int sz)
{
	int i = 0, j = 0;
	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
int main(void)
{
	int arr[10] = { 3,4,8,9,6,7,10,1,2,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr,sz);
	int i = 0;
	for (i = 0; i < 10; i++)
		printf("%d ", arr[i]);
	return 0;
}
           
【C語言】數組前言==一維數組==二維數組數組越界數組作為函數參數數組名最後

數組名

1.一般情況下,數組名是首元素的位址。

2.特例:

(1) sizeof(數組名),計算整個數組的大小,sizeof内部單獨放一個數組名,數組名表示整個數

組。

(2) &數組名,取出的是數組的位址。&數組名,數組名表示整個數組。

#include<stdio.h>
int main(void)
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9 };
	printf("%p\n", &arr);
	printf("%p\n", &arr + 1);
	printf("%p\n", &arr[0]);
	printf("%p\n", &arr[0] + 1);
	printf("%p\n", arr);
	printf("%p\n", arr+1);
	printf("%p\n", sizeof(arr));
	return 0;
}
           
【C語言】數組前言==一維數組==二維數組數組越界數組作為函數參數數組名最後

最後

十分感謝你可以耐着性子把它讀完和我可以堅持寫到這裡,送幾句話,對你,也對我:

你太急切的想要一個答案了。想要==風光的學位==,瞬間的博學,想要意氣風發,想閃着金光走向喜歡的人。

但現實告訴我,==操之過急便會敗北==,他要我等,要我耐得住不斷延長的時間線,要我傳遞出足夠的努力堆砌在沉悶、晦澀的時光裡,才肯将一切“我想要”一點一點遞送至我手裡。

“我知道你最近很累,是那種看不見的,==身體上和精神上的疲憊感==,但是請你一定要==堅持下去==。

就算無人問津也好,技不如人也罷,千萬别讓煩惱和焦慮毀了你本就不多的熱情和定力。别貪心,我們不可能什麼都有,别擔心,我們也不可能什麼都沒有。”