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

c語言指針和數組都有

發布時間: 2022-08-26 04:09:54

c語言中怎樣理解數組和指針

數組和指針的關系

一、數組的數組名其實可以看作一個指針。看下例:

例1:

int array[10]={0,1,2,3,4,5,6,7,8,9},value;

value=array[0];//也可寫成:value=*array;

value=array[3];//也可寫成:value=*(array+3);

value=array[4];//也可寫成:value=*(array+4);

上例中,一般而言數組名array代表數組本身,類型是int [10],但如果把array看做指針的話,它指向數組的第0個單元,類型是int *,所指向的類型是數組單元的類型即int。因此*array等於0就一點也不奇怪了。同理,array+3是一個指向數組第3個單元的指針,所以*(array+3)等於3。其它依此類推。

二、指針數組的定義及使用

例2:

char *str[3]={ //注意指針數組的定義及初始化格式

"Hello,this is a sample!",

"Hi,good morning.",

"Hello world"

};

char s[80];

strcpy(s,str[0]);//也可寫成strcpy(s,*str);

strcpy(s,str[1]);//也可寫成strcpy(s,*(str+1));

strcpy(s,str[2]);//也可寫成strcpy(s,*(str+2));

上例中,str是一個三單元的數組,該數組的每個單元都是一個指針,這些指針各指向一個字元串。把指針數組名str當作一個指針的話,它指向數組的第0號單元,它的類型是char**,它指向的類型是char *。
*str也是一個指針,它的類型是char*,它所指向的類型是char,它指向的地址是字元串"Hello,this is a sample!"的第一個字元的地址,即'H'的地址。 str+1也是一個指針,它指向數組的第1號單元,它的類型是char**,它指向的類型是char *。

*(str+1)也是一個指針,它的類型是char*,它所指向的類型是char,它指向"Hi,good morning."的第一個字元'H',等等。

三、數組名小結:
聲明了一個數組TYPE array[n],則數組名稱array就有了兩重含義:第一,它代表整個數組,它的類型是TYPE [n];第二,它是一個指針,該指針的類型是TYPE*,該指針指向的類型是TYPE,也就是數組單元的類型,該指針指向的內存區就是數組第0號單元,該指針自己佔有單獨的內存區,注意它和數組第0號單元占據的內存區是不同的。該指針的值是不能修改的,即類似array++的表達式是錯誤的。

在不同的表達式中數組名array可以扮演不同的角色。

(1)在表達式sizeof(array)中,數組名array代表數組本身,故這時sizeof函數測出的是整個數組的大小。

(2)在表達式*array中,array扮演的是指針,因此這個表達式的結果就是數組第0號單元的值。sizeof(*array)測出的是數組單元的大小。

(3)表達式array+n(其中n=0,1,2,....。)中,array扮演的是指針,故array+n的結果是一個指針,它的類型是TYPE*,它指向的類型是TYPE,它指向數組第n號單元。故sizeof(array+n)測出的是指針類型的大小。

四、數組指針的定義及使用:

例3:

int array[10];

int (*ptr)[10]; //數組指針ptr,指向一個數組int[10]

ptr=&array;

上例中ptr是一個指針,它的類型是int (*)[10],他指向的類型是int [10],我們用整個數組的首地址來初始化它。在語句ptr=&array中,array代表數組本身。

五、對指針和數組執行sizeof操作的結果:
sizeof(指針名稱)測出的究竟是指針自身類型的大小呢還是指針所指向的類型的大小?答案是前者。例如:

int (*ptr)[10];

則在32位程序中,有:

sizeof(int(*)[10])==4

sizeof(int [10])==40

sizeof(ptr)==4

實際上,sizeof(對象)測出的都是對象自身的類型的大小,而不是別的什麼類型的大小。

㈡ c語言中關於指針和數組的問題

你這個等於說就是p1依次被賦值為「you failed」和 「you passed」中的字元。你這應該是51單片機吧。
數組和指針關系:
其實數組的名就是一個指針,只不過是一個常量指針比如pass可以當做指針,因為他指向了一個地址×pass就是m1這個指針的地址

㈢ C語言指針和數組的關系

指針和數組是兩種不同的數據結構:
指針:邏輯結構是:長整型的類型,表示的是內存地址,它只能存放內存位元組的編號,它的意義是表示某個位元組在內存中的編號.物理結構是:佔四個位元組的一個長整型內存空間.特點是:它保存內存地址的編號.
數組:邏輯結構是:由多個並列關系的元素構成,各數組元素之間的地位是平等的.物理結構是:存儲在一塊連續的內存空間,邏輯相鄰的元素存放在相鄰的物理單元內.特點是:數組名稱同時表示該塊內存空間的起始地址,數組元素可以定義為任何數據類型.

㈣ 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;

  • }

㈤ C語言里數組和指針有什麼關系

C裡面數組名字就是數組這一塊內存空間的指針。
比如 int a[10], 你可以通過a[0]來訪問數組裡面的第一個元素,也可以使用*a,這類似於 int *a類型的數組。

㈥ C語言數組與指針

structord*p=dt//這里p是structord*類型指針,賦值後指向dt,相當於操作的是dt[0],起作用的就是第一和第二個數:1,2
structSp=data[1]//這里是重新定義了一個structS類型的變數,會分配一個結構體的內存空間,保存data[1]的拷貝,操作在這個拷貝上進行,起作用的第三和第四個數。初始化時個數不足的話,默認是0

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

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

經驗之談,樓樓加分啊

㈧ c語言指針和數組

C的多維數組與指針確實是一個比較令人迷惑的問題。數組名是一個地址,實際上,a、a[0]以及&a[0][0]的值是一樣的,但這並不是說它們三者是一樣的。我們知道指針是有類型的,int *p和int (*p)[4]是不一樣的,同樣,我們可以認為地址也是有類型的(雖然這樣說可能有點不恰當),只有相應類型的地址和指針才可以匹配,我們可以把二維數組a看成一個一維數組,它的每一個元素是一個int〔4〕的一維數組,因此a的「類型」是int〔4〕*,所以只能與int (*p)[4]匹配。而a[0]是一個一維數組,它的元素類型是int,因此a〔0〕的「類型」是int*,和int *p匹配。換句話說,值相等並能說明二者相同。可以參考譚浩強<<C程序設計>>多維數組與指針一節

如果定義int *p=&a[0][0],int (*q)[4]=a,我們如果用printf輸出p和q的值,可以看到二者的值是相等的,但是顯然p和q不是一樣的,直接體現在我們進行p++和q++操作時指針移動的位元組數是不一樣的

㈨ 關於C語言指針和數組

執行了兩次pa++後,指針pa由原來指向胡a[0]改為指向a[2];而pa[-1]代表2-1=1,即pa指向了a[1];
引入指針變數後,就可以用兩種方法來訪問數組元素了。
第一種方法為下標法,即用a[i]形式訪問數組元素。
第二種方法為指針法,即採用*(pa+i)形式,用間接訪問的方法來訪問數組元素。
望採納