數組與指針c語言精講,c語言指針數組編程例題

本文目錄一覽:

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-hk/n/135904.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
LUMZ的頭像LUMZ
上一篇 2024-10-04 00:15
下一篇 2024-10-04 00:15

相關推薦

  • Python導入數組

    本文將為您詳細闡述Python導入數組的方法、優勢、適用場景等方面,並附上代碼示例。 一、numpy庫的使用 numpy是Python中一個強大的數學庫,其中提供了非常豐富的數學函…

    編程 2025-04-29
  • Python返回數組:一次性搞定多種數據類型

    Python是一種多用途的高級編程語言,具有高效性和易讀性的特點,因此被廣泛應用於數據科學、機器學習、Web開發、遊戲開發等各個領域。其中,Python返回數組也是一項非常強大的功…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • 指針Python:為什麼Python中不需要使用指針?

    在Python中,指針的使用不像其他語言一樣那麼常見。這是因為Python有自己的內存管理方式,所以在大多數情況下,不需要顯式地使用指針。那麼,為什麼Python中不需要使用指針呢…

    編程 2025-04-29
  • Python去掉數組的中括號

    在Python中,被中括號包裹的數據結構是列表,列表是Python中非常常見的數據類型之一。但是,有些時候我們需要將列表展開成一維的數組,並且去掉中括號。本文將為大家詳細介紹如何用…

    編程 2025-04-29
  • Python操作數組

    本文將從多個方面詳細介紹如何使用Python操作5個數組成的列表。 一、數組的定義 數組是一種用於存儲相同類型數據的數據結構。Python中的數組是通過列表來實現的,列表中可以存放…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29

發表回復

登錄後才能評論