當前位置:首頁 » 編程語言 » 數組和指針c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

數組和指針c語言

發布時間: 2023-05-03 09:17:23

c語言中指針和數組是怎樣相互轉換的

指針數組,就是一個數組里存放的都是指針,比如*p[8];p[0]里存放的就是一個指針數據
數組指針,數組名就是一個指向數組起始地址的指針,數組下標是縈引,比如num[0],他就相當於num+0;
num這個指針沒移動,於是取的是數組的第一個。num[1]相當於數組指針移1,於是指向數組第二個

Ⅱ C語言中,指針和數組的區別和聯系

區別:C語言把內存劃分成四個區,它把一般的變數和數組等存在於內存中的棧區,所以數組在C語言的定義中只是一組同類型的普通變數,即使這個變數有可能是指針。所以他的作用比指針小的很多,而指針可以指向任何區的任何數據,所以就會覺得指針和數組名很像,但是必須要注意的是,數組名只是指針中的一種,它是指針中只指向棧區的且指針的移動范圍是有限的,即數組長度。而且數組在定義之初就已經有了自己的內存,一般的指針如果未指向某一個內存塊時,它是沒有自己的內存的,即所謂的野指針。
聯系:如上面所說,數組只是定義在棧區的一個連續變數,它的首地址就是一個指針。
總結:不僅數組有指針,所有變數都有指針,指針說白了就是內存中的地址,就像一個房間必須有一個房間號。在C/C++語言中定義一個指針,就是在棧區開辟一個內存空間用來存放它指向的內存地址,然後給指針賦值,就是把地址值賦值給剛才開辟的內存空間,然後通過訪問該內存中的地址值來間接訪問該地址下存放的數據。如果該地址值指向的是一塊靜態存儲區,如字元串常量等,當然就不可以修改指向的內容啦。

經驗之談,樓樓加分啊

Ⅲ c語言中數組和指針的區別與聯系

數組是用指針方式實現的,但數組值是一個常量,即不能改變數組的首地址,而指針是一個變數,可以改變它的值;如:數組 a和指針p,p=a+1;是合法的,但a=a+1;是不合法的。

Ⅳ C語言中數組名和指針的區別

數組在當作參數傳遞時,可以當作指針;當然,參數傳遞相當於賦值操作,所以用指針來接受數組的值也是可以的。

除此之外,指針就是指針,數組就是數組,一點也不一樣,例如
1,數組名不能作為左值,即不能被賦值,也不能進行++ --操作
2,sizeof 數組名 和 sizeof 指針 不同

Ⅳ C語言:簡述一下「數組和指針的關系」

一、概念

  • 數組:數組是用於儲存多個相同類型數據的集合。

  • 指針:指針相當於一個變數,但是它和不同變數不一樣,它存放的是其它變數在內存中的地址。

  • 二、賦值、存儲方式、求sizeof、初始化等

    1.賦值

    同類型指針變數可以相互賦值,數組不行,只能一個一個元素的賦值或拷貝

    2.存儲方式

  • 數組:數組在內存中是連續存放的,開辟一塊連續的內存空間。數組是根據數組的下進行訪問的,多維數組在內存中是按照一維數組存儲的,只是在邏輯上是多維的。

  • 數組的存儲空間,不是在靜態區就是在棧上。

  • 指針:指針很靈活,它可以指向任意類型的數據。指針的類型說明了它所指向地址空間的內存。

  • 指針:由於指針本身就是一個變數,再加上它所存放的也是變數,所以指針的存儲空間不能確定。

    3.求sizeof

  • 數組:

  • 數組所佔存儲空間的內存:sizeof(數組名)
    數組的大小:sizeof(數組名)/sizeof(數據類型)

  • 指針:

  • 在32位平台下,無論指針的類型是什麼,sizeof(指針名)都是4,在64位平台下,無論指針的類型是什麼,sizeof(指針名)都是8。

    關於指針和數組求sizeof,我在之前的博客中寫過,現將連接貼上:
    https://blog.csdn.net/cherrydreamsover/article/details/81589838

    4.初始化

  • 數組:

  • (1)char a[]={"Hello"};//按字元串初始化,大小為6.(2)char b[]={'H','e','l','l'};//按字元初始化(錯誤,輸出時將會亂碼,沒有結束符)(3)char c[]={'H','e','l','l','o',''};//按字元初始化1234

  • 這里補充一個大家的誤區,就是關於數組的創建和銷毀,尤其是多維數組的創建與銷毀。
    (1)一維數組:
    int* arr = new int[n];//創建一維數組
    delete[] arr;//銷毀
    (2)二維數組:
    int** arr = new int*[row];//這樣相當於創建了數組有多少行
    for(int i=0;i<row;i++)
    {
    arr[i] = new int[col];//到這里才算創建好了
    }
    //釋放
    for(int i=0;i<row;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

  • 三、傳參

  • 數組:

  • 數組傳參時,會退化為指針,所以我們先來看看什麼是退化!
    (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.h>void print(int *p, int sz)

  • {int i = 0;for(i=0; i<sz; i++)

  • {printf("%d ", *(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.h>void test(int** ptr)

  • {printf("num = %d ", **ptr);

  • }int main()

  • {int num = 10;int*p = &num;int **pp = &p;

  • test(pp);

  • test(&p);return 0;

  • }

  • 四、函數指針、函數指針數組、函數指針數組的指針

    1.函數指針

  • void test()

  • {printf("hehe ");

  • }//pfun能存放test函數的地址void (*pfun)();

  • 函數指針的形式:類型(*)( ),例如:int (*p)( ).它可以存放函數的地址,在平時的應用中也很常見。

    2.函數指針數組

    形式:例如int (*p[10])( );
    因為p先和[ ]結合,說明p是數組,數組的內容是一個int (*)( )類型的指針
    函數指針數組在轉換表中應用廣泛

    3.函數指針數組的指針

    指向函數指針數組的一個指針,也就是說,指針指向一個數組,數組的元素都是函數指針

  • void test(const char* str)

  • {printf("%s ", 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;

  • }