本文目錄一覽:
C語言:簡述一下「數組和指針的關係」?
一、概念
數組:數組是用於儲存多個相同類型數據的集合。
指針:指針相當於一個變數,但是它和不同變數不一樣,它存放的是其它變數在內存中的地址。
二、賦值、存儲方式、求sizeof、初始化等
1.賦值
同類型指針變數可以相互賦值,數組不行,只能一個一個元素的賦值或拷貝
2.存儲方式
數組:數組在內存中是連續存放的,開闢一塊連續的內存空間。數組是根據數組的下進行訪問的,多維數組在內存中是按照一維數組存儲的,只是在邏輯上是多維的。
數組的存儲空間,不是在靜態區就是在棧上。
指針:指針很靈活,它可以指向任意類型的數據。指針的類型說明了它所指向地址空間的內存。
指針:由於指針本身就是一個變數,再加上它所存放的也是變數,所以指針的存儲空間不能確定。
3.求sizeof
數組:
數組所佔存儲空間的內存:sizeof(數組名)
數組的大小:sizeof(數組名)/sizeof(數據類型)
指針:
在32位平台下,無論指針的類型是什麼,sizeof(指針名)都是4,在64位平台下,無論指針的類型是什麼,sizeof(指針名)都是8。
關於指針和數組求sizeof,我在之前的博客中寫過,現將連接貼上:
4.初始化
數組:
(1)char a[]={“Hello”};//按字元串初始化,大小為6.(2)char b[]={‘H’,’e’,’l’,’l’};//按字元初始化(錯誤,輸出時將會亂碼,沒有結束符)(3)char c[]={‘H’,’e’,’l’,’l’,’o’,’\0′};//按字元初始化1234
這裡補充一個大家的誤區,就是關於數組的創建和銷毀,尤其是多維數組的創建與銷毀。
(1)一維數組:
int* arr = new int[n];//創建一維數組
delete[] arr;//銷毀
(2)二維數組:
int** arr = new int*[row];//這樣相當於創建了數組有多少行
for(int i=0;irow;i++)
{
arr[i] = new int[col];//到這裡才算創建好了
}
//釋放
for(int i=0;irow;i++)
{
delete[] arr[i];
}
delete[] arr;
指針:
//(1)指向對象的指針:(()裡面的值是初始化值)int *p=new int(0) ; delete p;//(2)指向數組的指針:(n表示數組的大小,值不必再編譯時確定,可以在運行時確定)int *p=new int[n]; delete[] p;//(3)指向類的指針:(若構造函數有參數,則new Class後面有參數,否則調用默認構造函數,delete調用析構函數)Class *p=new Class; delete p;//(4)指針的指針:(二級指針)int **pp=new (int*)[1];
pp[0]=new int[6];delete[] pp[0];12345678910
這裡我們區分兩個重要的概念:指針數組、數組指針。
(1)指針數組:它實際上是一個數組,數組的每個元素存放的是一個指針類型的元素。
int* arr[8];//優先順序問題:[]的優先順序比*高//說明arr是一個數組,而int*是數組裡面的內容//這句話的意思就是:arr是一個含有8和int*的數組1234
請點擊輸入圖片描述
(2)數組指針:它實際上是一個指針,該指針指向一個數組。
int (*arr)[8];//由於[]的優先順序比*高,因此在寫數組指針的時候必須將*arr用括弧括起來//arr先和*結合,說明p是一個指針變數//這句話的意思就是:指針arr指向一個大小為8個整型的數組。1234
請點擊輸入圖片描述
三、傳參
數組:
數組傳參時,會退化為指針,所以我們先來看看什麼是退化!
(1)退化的意義:C語言只會以值拷貝的方式傳遞參數,參數傳遞時,如果只拷貝整個數組,效率會大大降低,並且在參數位於棧上,太大的數組拷貝將會導致棧溢出。
(2)因此,C語言將數組的傳參進行了退化。將整個數組拷貝一份傳入函數時,將數組名看做常量指針,傳數組首元素的地址。
1.一維數組的傳參
#include stdio.h//傳參方式正確//用數組的形式傳遞參數,不需要指定參數的大小,因為在一維數組傳參時,形參不會真實的創建數組,傳的只是數組首元素的地址。(如果是變數的值傳遞,那麼形參就是實參的一份拷貝)void test(int arr[])
{}//傳參方式正確//不傳參數可以,傳遞參數當然也可以void test(int arr[10])
{}//傳參方式正確//一維數組傳參退化,用指針進行接收,傳的是數組首元素的地址void test(int *arr)
{}//傳參方式正確//*arr[20]是指針數組,傳過去的是數組名void test2(int *arr[20])
{}//傳參方式正確//傳過去是指針數組的數組名,代表首元素地址,首元素是個指針向數組的指針,再取地址,就表示二級指針,用二級指針接收void test2(int **arr)
{}int main()
{int arr[10] = {0};int *arr2[20] = {0};
test(arr);
test2(arr2);
}
2.二維數組的傳參
//傳參正確//表明二維數組的大小,三行五列void test(int arr[3][5])
{}//傳參不正確//二維數組的兩個方括弧,不能全部為空,也不能第二個為空,只能第一個為空void test(int arr[][])
{}//傳參正確//可以寫成如下這樣傳參形式,但是不能寫int arr[3][]void test(int arr[][5])
{}//傳參不正確//arr是一級指針,可以傳給二維數組,但是不能正確讀取void test(int *arr)
{}//傳參不正確//這裡的形參是指針數組,是一維的,可以傳參,但是讀取的數據不正確void test(int* arr[5])
{}//傳參正確//傳過去的是二維數組的數組名,即數組首元素的地址,也就是第一行的地址,第一行也是個數組,用一個數組指針接收void test(int (*arr)[5])
{}//傳參不正確//可以傳參,但是在讀取的時候會有級別不同的問題void test(int **arr)
{}int main()
{int arr[3][5] = {0};
test(arr);
}
指針:
1.一級指針傳參
當函數參數部分是一級指針時,可以接受什麼參數例如:test(int*p)
(1)可以是一個整形指針
(2)可以是整型變數地址
(3)可以是一維整型數組數組名
#include stdio.hvoid print(int *p, int sz)
{int i = 0;for(i=0; isz; i++)
{printf(“%d\n”, *(p+i));
}
}int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9};int *p = arr;int sz = sizeof(arr)/sizeof(arr[0]);//一級指針p,傳給函數print(p, sz);return 0;
}
2.二級指針傳參
即當函數參數部分是二級指針時,可以接受什麼參數例如:test(int**p)
(1)二級指針變數
(2)一級指針變數地址
(3)一維指針數組的數組名
#include stdio.hvoid test(int** ptr)
{printf(“num = %d\n”, **ptr);
}int main()
{int num = 10;int*p = num;int **pp = p;
test(pp);
test(p);return 0;
}
四、函數指針、函數指針數組、函數指針數組的指針
1.函數指針
void test()
{printf(“hehe\n”);
}//pfun能存放test函數的地址void (*pfun)();
函數指針的形式:類型(*)( ),例如:int (*p)( ).它可以存放函數的地址,在平時的應用中也很常見。
2.函數指針數組
形式:例如int (*p[10])( );
因為p先和[ ]結合,說明p是數組,數組的內容是一個int (*)( )類型的指針
函數指針數組在轉換表中應用廣泛
3.函數指針數組的指針
指向函數指針數組的一個指針,也就是說,指針指向一個數組,數組的元素都是函數指針
void test(const char* str)
{printf(“%s\n”, str);
}int main()
{//函數指針pfunvoid (*pfun)(const char*) = test;//函數指針的數組pfunArrvoid (*pfunArr[5])(const char* str);
pfunArr[0] = test;//指向函數指針數組pfunArr的指針ppfunArrvoid (*(*ppfunArr)[10])(const char*) = pfunArr;return 0;
}
c語言中的數組和指針的區別
C語言中,數組的名稱等價於數組的首地址,
當然可以利用指針開闢動態空間,使用方式與數組在形式上相同的,
但是他們有一個本質的區別,數組名相當於一個地址常數,而指針是一個以地址為內容的變數。
指針與數組的關係可以參考下面的網頁:
C語言數組與指針,請講解為什麼。
int
(*p)[4];
//
定義一個數組指針,指向含4個元素的一維數組,數組元素是int類型。
int
*p[4];
//
定義一個指針數組,數組中每個元素是一個指針,指針指向哪裡就要根據程序來定了。
判斷數組指針與指針數組主要通過運算符的優先順序來判斷。
int
(*p)[4];
//
由於(
)的優先順序高,說明p是一個指針,指向一個一維數組的指針
int
*p[4];
//
由於[
]的優先順序高,先與p結合成為一個數組,再由int*說明這是一個整型指針數組
c語言中數組和指針的區別與聯繫
數組是用指針方式實現的,但數組值是一個常量,即不能改變數組的首地址,而指針是一個變數,可以改變它的值;如:數組 a和指針p,p=a+1;是合法的,但a=a+1;是不合法的。
原創文章,作者:LUMZ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/135904.html