1樓:匿名使用者
一維陣列 可以認為是常量一維指標. 即除了不能修改值, 其他都可以當指標操作.
多維陣列, 可以認為是對應的陣列指標.
陣列名和指標最大的區別是, 陣列名自身不佔用記憶體空間, 即&陣列名得到的地址還是陣列名值本身, 亦即陣列首地址. 而指標是有自己的記憶體空間的, &指標變數, 得到的是另外一個地址.
c++陣列名和指標的區別
2樓:冰紅茶配黃燜雞
陣列名確實表示指向陣列首地址的指標,但這個指標很特別,它的值(指標的值指的是指標所指的地址)不能被改寫,能改寫的僅僅是其指向的內容,換句話說,陣列名只能指向陣列的首地址,如果有陣列char a;那麼如果出現a = a+1;這是編譯都通不過的錯誤。而對於一個普通的指標是可以的,再比如有陣列char a;那麼再定義一個char *p = a;然後再用p = p+1是合法的,這表示讓指標p指向&a[1]。
它們的第二個區別是:每當用到陣列名這個指標的時候,系統都會傳入陣列的資訊,而普通的指標只是一個4位元組的整數,例如:
char a[5];
char *p = a;//指標a和指標p都指向陣列a的首地址cout << sizeof (a) << "##" << sizeof (p) << endl;
這時的執行結果是「5##4」
陣列名和指標的區別是什麼?
3樓:手機使用者
可以!下面是我學習陣列
和指標的總結: (1)指向陣列首地址
對於一維陣列a[10]:陣列的首地址為a; 呼叫:p=a; *(a+i)或者*(p+i)
對於二維陣列a[3][4]:整個陣列的首地址為a[0];呼叫:p=a[0]; *(a[0]+i)或者*(p+i)。此時a代表陣列第一行的地址。
(3)指向陣列的每行
形如:int a[3][4];
int (*p)[4]; p=a;
呼叫:*(*(p+i)+j)例:;
int (*p)[4],i,j;
cin>>i>>j;
p=a; //a代表的是陣列第一行的首地址.
cout<<*(*(p+i)+j)< (4)指標陣列 例如:(字串陣列指標法) ; cout< 處理字串還有以下方法: (字元陣列法,c-string法) ;cout< (字串陣列法,string法) ; cout< 三種方法的共同點是name[0]都是代表的"basic"的首地址而非其本身。 (5)指向指標的指標 形如 char **p;例:; p=name+2; cout<<*p< cout<<**p< 分析:*p=name[2]= "c++"的首地址,(通常所說一個字串的「地址」實際上指的是它的「首地址」或者「起始地址」),用cout 輸出的不是字串的首地址而是整個字串(只要把一個字串的起始地址給它,cout就一直往後面輸出,直到遇到結束符'\0'為止),為了證明這一點,請看:string a=「finish」;cout<
故:本例中第一個*p輸出"c++",第二個**p代表"c++"的首地址的內容,即c。 在上一例中,name[0]為"basic"的首地址,輸出"basic",若換成*name[0]則輸出b,若換成name則代表整個陣列的首地址(而不是單個字串"basic"的首地址),所以此時輸出的是整個陣列的首地址。若用*name則輸出整個陣列的首地址的內容,即"basic"(可見字串的首地址內容為單個字元,一維陣列首地址的內容為它的第一個元素,對於二維陣列,比如int a[3][4],a代表的是第一行的地址,所以cout<
4樓:查有福季嫣 可以。a是陣列名,相當於陣列的首地址,b是一個指標,int*b= a;然後b就指向a這個地址,呼叫b[4]就是b+4的地方,也就是a+4這個地方,然後就是同一個地方,所以b[4]等價於a[4] 5樓:閩忠饒俏 首先指標陣列 和陣列指標叫法本身是種誤導 指標陣列:array ofpointers,即用於儲存指標的陣列,也就是陣列元素都是指標陣列指標:a pointerto anarray,即指向陣列的指標 其次他們本質一個是陣列,一個是指標 int* a[4] 表示是一個陣列 陣列a中的元素都為int型指標 元素表示:*a[i] *(a[i])是一樣的,因為優先順序高於* int(*a)[4] 表示是一個指標 指向陣列a的指標 元素表示:(*a)[i] #include using namespace std; intmain() ;int *a[4];//指標陣列 int(*b)[4];//陣列指標 b=&c; //將陣列c中元素賦給陣列a for(int i=0;i<4;i++) //輸出看下結果 cout<<*a[1]< intmain() {int a[5]; printf("%d\n", a);printf("%d\n", &a); printf("%d\n",a+ 1);//它的進階單位是1個int位元組數 printf("%d\n", (int*)&a+1); //它的進階單位是1個int位元組數 int(*)可以強轉為 int* printf("%d\n", //它的進階單位是1個int位元組數 printf("%d\n",&a+ 1);//它的進階單位是整個陣列的位元組長度printf("%d\n", &a[0] +1); //它的進階單位是1個int位元組數 printf("---------------\n"); printf("%d\n",sizeof(a)); //通過陣列名獲取的是陣列的大小 printf("%d\n",sizeof(&a)); //通過取陣列名獲取的是指標的大小 return0; c語言中,指標和陣列的區別和聯絡? 6樓:匿名使用者 區別:c語言把記憶體劃分成四個區,它把一般的變數和陣列等存在於記憶體中的棧區,所以陣列在c語言的定義中只是一組同型別的普通變數,即使這個變數有可能是指標。所以他的作用比指標小的很多,而指標可以指向任何區的任何資料,所以就會覺得指標和陣列名很像,但是必須要注意的是,陣列名只是指標中的一種,它是指標中只指向棧區的且指標的移動範圍是有限的,即陣列長度。 而且陣列在定義之初就已經有了自己的記憶體,一般的指標如果未指向某一個記憶體塊時,它是沒有自己的記憶體的,即所謂的野指標。 聯絡:如上面所說,陣列只是定義在棧區的一個連續變數,它的首地址就是一個指標。 總結:不僅陣列有指標,所有變數都有指標,指標說白了就是記憶體中的地址,就像一個房間必須有一個房間號。在c/c++語言中定義一個指標,就是在棧區開闢一個記憶體空間用來存放它指向的記憶體地址,然後給指標賦值,就是把地址值賦值給剛才開闢的記憶體空間,然後通過訪問該記憶體中的地址值來間接訪問該地址下存放的資料。 如果該地址值指向的是一塊靜態儲存區,如字串常量等,當然就不可以修改指向的內容啦。 經驗之談,樓樓加分啊 7樓:匿名使用者 指標就是一個裝地址的變數,陣列是記憶體中的一個區域,而陣列名是這個區域的首地址。也就是說你在定義指標的時候編譯器只分配了一個變數的空間(空間大小由記憶體地址長度決定),而定義陣列的時候編譯器分配了一段區域的空間(空間大小由[ ]裡面的數字和陣列的型別決定)。使用上你可以把一個地址賦值給指標,但是不能賦值給陣列名。 你可以直接給陣列裡面的變數賦值,這是安全的,因為記憶體已經申請好了,而給指標裡面裝個那個地址賦值就要小心了,因為指標裡面那個地址很可能會出錯。 8樓:匿名使用者 陣列 eg: a[10] 這個陣列名a就是一個指標, 那如果是在動態記憶體中建立一個陣列的話,是沒有陣列名可以被使用的,必須用指標(解引用)間接來呼叫,所以陣列和指標是分不開的 9樓:不再猶豫 一維陣列名可以看做一個儲存陣列首地址的常量,不可變。而指標是個儲存地址變數,可根據需要指向不同元素;宣告一個陣列,就可以對陣列相應的儲存空間內的資料進行賦值,修改;指標則是宣告後,必須先對指標賦予地址,然後對所賦予地址中的資料進行賦值,修改(注意越界) 陣列名確實表示指向陣列首地址的指標,但這個指標很特別,它的值 指標的值指的是指標所指的地址 不能被改寫,能改寫的僅僅是其指向的內容,換句話說,陣列名只能指向陣列的首地址,如果有陣列char a 那麼如果出現a a 1 這是編譯都通不過的錯誤。而對於一個普通的指標是可以的,再比如有陣列char a 那... 就是指向一個地址。陣列第一個元素的地址就是陣列地址。你的理解從本質來 上就有問題自 int p1 a不能通過編譯,因為a是二維陣列指標,型別是int 3 無法轉換到int 型。必須用int p1 3 a或者int p1 a 0 才可以。同理int p2 a 0 無法通過編譯,因為a 0 是一個int... a不等抄價於 a 0 0 a和 a 0 0 的值是相同的,bai但型別不同。dua是二維陣列的地zhi 址,而 a 0 0 是int變數的dao地址,含量不同。正確的說法是 a a 0 而a 0 a 0 0 又因為有制 a 0 a 0 a 0 0 我感覺這句理解錯了。bai a 0 a 0 0 而不...C陣列名和指標的區別,CC中,陣列名和指標的區別
關於c語言把陣列名賦予指標的問題
c語言用二維陣列名引用元素的指標表示方法