C語言 array數(shù)組的用法詳解
一維數(shù)組的創(chuàng)建與初始化
數(shù)組是一種相同類型元素的集合
程序一:
#include<stdio.h>
#include<string.h>
int main()
{
創(chuàng)建一個(gè)數(shù)組
int arr1[10];// [常量]
初始化 int arr[10]={1,2,3};不完全初始化,剩下的元素默認(rèn)初始化0.
char arr2[5];
初始化 char arr[5]={'a','b'};,不完全初始化,剩下元素默認(rèn)初始化0.
初始化 char arr[5]="ab" 這是可行的,因?yàn)殡[藏一個(gè)'\0',后面的0使我們自己給的(這個(gè)字符串都給給它的==),不是系統(tǒng)默認(rèn)
int n = 5;
char ch[n]; 這樣創(chuàng)建數(shù)組是錯(cuò)誤,因?yàn)閚還是變量,值是被賦值了,并不會(huì)改變它的屬性
char arr3[5] = { 'a', 98/*b的ASCII碼等于98*/ };//可行
上式等價(jià)于下式
char arr3[5] = {'a','b'}
char arr4[] = "abcd";//加上后面隱藏的'\0',大小為5
當(dāng)我們并沒有指定大小的時(shí)候,它會(huì)根據(jù)后面的數(shù)據(jù),自己給定大小
char arr5[] = "abcdef";
printf("%d\n",sizeof(arr5));// 7 sizeof暈倒'\0',把它算進(jìn)去,在停止計(jì)算
printf("%d\n", strlen(arr5));//6 strlen是遇到'\0'(不包含),就停止計(jì)算
char arr6[] = { 'a', 'b','c','\0' };
printf("%d\n",strlen(arr6));//如果沒有'\0'結(jié)束標(biāo)志符,它會(huì)一直算個(gè)數(shù),直到遇到'\0',輸出的是一個(gè)隨機(jī)數(shù)
printf("%d\n", sizeof(arr6));//沒有'\0'它就少算一個(gè)就是3
return 0;
}
程序二:
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "abcdef";//元素下標(biāo)是從0開始
pritnf("%c\n",arr[0]); //arr[0] == a,表示首元素a,輸出結(jié)果為a
如果要依次打印字符串所有元素用循環(huán)更簡(jiǎn)單,字符串的 '\0' 是隱藏的,一般是不用打印的
int i = 0;
int len = strlen(arr);// 計(jì)算元素個(gè)數(shù)
for (i = 0; i < len; i++)
{
printf("%c ",arr[i]);// a b c d e f
}
return 0;
}
程序三
#include<stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int sz = sizeof(arr) / sizeof(arr[0]);
// sizeof(數(shù)組名)計(jì)算的整個(gè)數(shù)組的字節(jié)大小,我們只要再求一個(gè)元素的大小就可以了,因?yàn)?數(shù)組是一群相同類型數(shù)據(jù)的集合,所以我
// 假設(shè) int a[10]; 數(shù)組 a 有 10個(gè) int(4byte) 類型的元素,整個(gè)數(shù)組的大小就是 4*10 == 40 byte, 數(shù)組大小除以數(shù)組元素大小,不就是數(shù)組元素個(gè)數(shù)嘛。(40/4 == 10)
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ",arr[i]);
printf("&arr[%d]=%p\n",i,&arr[i]);// 打印 數(shù)組對(duì)應(yīng)下標(biāo)元素的地址
}
return 0;
}
程序四(二維數(shù)組 - 二維數(shù)組 的 列 絕對(duì)不能 省略 )
#include<stdio.h>
int main()
{
///int arr[3][4];//存儲(chǔ)一個(gè)三行四列的數(shù)據(jù) 3是行(3個(gè)一維數(shù)組),4是列
int arr1[3][4] = {1,2,3,4,5};
假設(shè) 數(shù)據(jù) 是這樣存的,在內(nèi)存是連續(xù)存儲(chǔ)的12345000.....
1234
5000
0000
int arr2[3][4] = { { 1, 2, 3 } , { 4, 5 } };
1 2 3 0
4 5 0 0
0 0 0 0
一行的數(shù)據(jù) 是根據(jù)元素加個(gè)后面的{ },方便你們?nèi)^(qū)分,再根據(jù)列數(shù)確定 一行有多少個(gè)元素
int arr3[][4] = { { 1, 2, 3 }, { 4, 5 } };
1 2 3 0
4 5 0 0
二維數(shù)組不管行還是列,下標(biāo)都是從0開始,而且 二維數(shù)組的 行 是可以省略的,它會(huì)根據(jù) 元素 和 列的值,來確定行數(shù)
int arr4[3][4] = { { 1, 2, 3 }, { 4, 5 } };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("%d ",arr4[i][j]);1 2 3 0
4 5 0 0
0 0 0 0
}
printf("\n");
}
return 0;
}
二維數(shù)組在內(nèi)存中的存儲(chǔ)
在內(nèi)存中實(shí)際存儲(chǔ)情況,第一行完了,第二行緊跟在第一行,第三行緊跟在第二行,int a[2][2]={1,2,3,4}, 在內(nèi)存中存儲(chǔ)情況為 1 2 3 4 (小端)
因?yàn)?數(shù)組的首元素地址是最小的,后面元素,地址依次增大(大約增大 一個(gè)元素的類型的字節(jié)大?。?/p>
程序一
#include<stdio.h>
int main()
{
int arr[3][4] = { { 1, 2, 3 }, { 4, 5 } };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("arr[%d][%d]=%p\n", i, j, &arr[i][j]);
arr[0][3]和arr[1][0]地址相差4,二維數(shù)組與一維數(shù)組一樣,都連續(xù)存儲(chǔ)
}
}
return 0;
}

數(shù)組作為函數(shù)參數(shù),怎么作?
實(shí)例:冒泡排序
#include<stdio.h>
void bubble_sort(int arr[],int sz)
{
確定冒號(hào)排序的趟數(shù)
int i = 0;
for (i = 0; i < sz - 1; i++)// 排序要排 元素總個(gè)數(shù)-1,最后一個(gè)元素不用排
{
int flag = 1;//假設(shè)這一趟的數(shù)據(jù)已經(jīng)有序
int j = 0;
for (j = 0; j < sz-1-i; j++)// 每一趟冒號(hào)排序的過程
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;//本趟排序的數(shù)據(jù)不完全有序
}
}
if (1 == flag)
{
break;
}
}
}
int main()
{
int arr[] = { 0, 8, 7, 6, 5, 4, 3, 2, 1, 9 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz);
對(duì)數(shù)組arr進(jìn)行傳參,傳遞的是數(shù)組arr首元素的地址
for (i = 0; i < sz; i++)
{
printf("%d ",arr[i]);//0,1,2,3,4,5,6,7,8,9
}
return 0;
}
數(shù)組名:
#include<stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7 };//數(shù)組隨著下標(biāo)的增長,地址是由低到高變化點(diǎn)
printf("%p\n",arr);
數(shù)組名就是數(shù)組首元素地址,是一樣的。見附圖1
printf("%p\n",&arr[0]);
但有兩個(gè)意外
1.sizeof(數(shù)組名) - 數(shù)組名表示整個(gè)數(shù)組 ,計(jì)算的是整個(gè)數(shù)組的大小,單位為字節(jié)(byte)
int sz = sizeof(arr);
printf("%d\n",sz);// 4(元素大小)* 7(元素個(gè)數(shù))== 28,效果見附圖 2
2.&(數(shù)組名),數(shù)組名代表整個(gè)數(shù)組,&數(shù)組名,取的是整個(gè)數(shù)組的地址
printf("%p\n", &arr);//表示數(shù)組的起始地址,是整個(gè)數(shù)組的地址
上下兩者的值一樣,但 意義完全不同,效果圖 見附圖 3
printf("%p\n", arr);//首元素的地址
//進(jìn)一步論證 &arr 和 arr的意義完全不同,不同在哪里
printf("%p\n", &arr+1);//地址增加28字節(jié),一個(gè)元素4byte,7個(gè)元素28字節(jié),意味著 &arr + 1 跳過一整個(gè)數(shù)組的元素,指向最后一個(gè)元素后面的地址
printf("%p\n", arr+1);//地址增加4字節(jié),意味著 arr +1,跳過一個(gè)元素,改地址 arr+1,指向第二個(gè)元素
效果見附圖 4
return 0;
}
關(guān)于數(shù)組名,有興趣的,可以看看我這篇文章指針和數(shù)組試題解析(重置版)
附圖1;

附圖2:

附圖3:

附圖4:

本文結(jié)束
到此這篇關(guān)于C語言 array數(shù)組的用法詳解的文章就介紹到這了,更多相關(guān)C語言 array數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言中對(duì)于循環(huán)結(jié)構(gòu)優(yōu)化的一些入門級(jí)方法簡(jiǎn)介
這篇文章主要介紹了C語言中對(duì)于循環(huán)結(jié)構(gòu)優(yōu)化的一些入門級(jí)方法,包括算法設(shè)計(jì)的改進(jìn)來提高一些并行性等方法,要的朋友可以參考下2015-12-12
Qt+QWidget實(shí)現(xiàn)簡(jiǎn)約美觀的加載動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了Qt如何結(jié)合QWidget實(shí)現(xiàn)簡(jiǎn)約美觀的加載動(dòng)畫,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
C++?OpenCV實(shí)戰(zhàn)之車道檢測(cè)
這篇文章主要介紹了基于C++?OpenCV實(shí)現(xiàn)的車道檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
使用C語言遞歸與非遞歸實(shí)現(xiàn)字符串反轉(zhuǎn)函數(shù)char *reverse(char *str)的方法
本篇文章是對(duì)使用C語言遞歸與非遞歸實(shí)現(xiàn)字符串反轉(zhuǎn)函數(shù)char *reverse(char *str)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C++多線程實(shí)現(xiàn)TCP服務(wù)器端同時(shí)和多個(gè)客戶端通信
通訊建立后首先由服務(wù)器端發(fā)送消息,客戶端接收消息;接著客戶端發(fā)送消息,服務(wù)器端接收消息,實(shí)現(xiàn)交互發(fā)送消息。本文主要介紹了C++多線程實(shí)現(xiàn)TCP服務(wù)器端同時(shí)和多個(gè)客戶端通信,感興趣的可以了解一下2021-05-05
VS中動(dòng)態(tài)庫的創(chuàng)建和調(diào)用方式詳解
庫的存在形式本質(zhì)上來說庫是一種可執(zhí)行代碼的二進(jìn)制,? 靜態(tài)庫和動(dòng)態(tài)庫的區(qū)別主要是在鏈接階段處理庫的方式不同而區(qū)分的,本文介紹VS中動(dòng)態(tài)庫的創(chuàng)建和調(diào)用方式,感興趣的朋友一起看看吧2024-01-01
復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼
復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼。需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-10-10

