在本文中,您將了解數(shù)組與指針之間的關(guān)系,并在程序中有效地使用它們。
指針是保存地址的變量。指針不僅可以存儲(chǔ)單個(gè)變量的地址,還可以存儲(chǔ)數(shù)組單元的地址。
看以下示例:
int* ptr; // 定義指針變量ptr
int a[5];
ptr = &a[2]; // &a[2]是a[5]這個(gè)數(shù)組的第三個(gè)元素的地址。
????????假設(shè)指針需要指向數(shù)組的第四個(gè)元素,即在上述情況下的第四個(gè)數(shù)組元素的保存地址。由于ptr指向上面示例中的第三個(gè)元素,ptr + 1將指向第四個(gè)元素。您可能會(huì)認(rèn)為,ptr +1為您提供了ptr的下一個(gè)字節(jié)的地址。 但這是不正確的。這是因?yàn)橹羔榩tr是指向int的指針,并且int的大小對于操作系統(tǒng)是固定的(64位操作系統(tǒng)中int類型大小是4字節(jié))。 因此,ptr和ptr +1之間的地址相差4個(gè)字節(jié)。如果指針ptr是指向char的指針,那么ptr和ptr + 1之間的地址將相差1個(gè)字節(jié),因?yàn)橐粋€(gè)字符的大小是1個(gè)字節(jié)。
示例1:C ++指針和數(shù)組
C ++程序使用數(shù)組和指針顯示數(shù)組元素的地址
#include <iostream>
int main() {
float arr[5]; // 定義浮點(diǎn)型數(shù)組
float* ptr; // 定義一個(gè)浮點(diǎn)型指針變量ptr
std::cout << "使用數(shù)組顯示地址:" << std::endl;
for (int i = 0; i < 5; i++) {
std::cout << "&arr[" << i << "]=" << &arr[i] << std::endl;
}
ptr = arr; // 將arr數(shù)組的首地址賦給指針變量ptr
std::cout << "\n使用指針顯示地址" << std::endl;
for (int i = 0; i < 5; i++) {
std::cout << "ptr+" << i << "=" << ptr + i << std::endl;
}
return 0;
}
輸出結(jié)果為: (結(jié)果不唯一)
????????在上面的程序中,使用不同的指針ptr來顯示數(shù)組元素arr的地址。但是,數(shù)組元素可以通過使用相同的數(shù)組名arr來使用指針表示法來訪問。例如:
int?arr[3]; &arr[0]?等同于?arr &arr[1]?等同于?arr?+?1 &arr[2]?等同于?arr?+?2
代碼如下:?
#include <iostream>
int main() {
int arr[3];
std::cout << "&arr[0]的值為:"<< &arr[0] << std::endl;
std::cout << "arr的值為:" << arr << std::endl;
std::cout << "&arr[1]的值為:" << &arr[1] << std::endl;
std::cout << "arr+1的值為:" << arr +1 << std::endl;
return 0;
}
?????????運(yùn)行上述程序,得到結(jié)果如下(結(jié)果不唯一,這是因?yàn)槊看芜\(yùn)行時(shí)給數(shù)組分配的地址不一樣):
?
示例2:指針和數(shù)組
C ++程序使用指針符號顯示數(shù)組元素的地址。
#include <iostream>
using namespace std;
int main() {
float arr[5];
cout<<"使用指針符號顯示地址: "<< endl;
for (int i = 0; i < 5; ++i) {
cout << arr + i <<endl;
}
return 0;
}
輸出結(jié)果:(結(jié)果不唯一)?
????????您知道,指針ptr保存地址,而表達(dá)式*ptr給出存儲(chǔ)在地址中的值。類似地,可以使用*(ptr + 1)獲取存儲(chǔ)在指針ptr + 1中的值。
請考慮以下代碼:
int?ptr[5]?=?{3,?4,?5,?5,?3};
-
&ptr[0]等于ptr,*ptr等于ptr[0]
-
&ptr[1]等于ptr + 1,*(ptr + 1)?等于ptr[1]
-
&ptr[2]等于ptr + 2,*(ptr + 2)等于ptr[2]
-
&ptr[i]等于ptr + i ,*(ptr + i)等于ptr[i]
驗(yàn)證代碼如下:?
#include <iostream>
int main() {
int arr[5] = { 1,3,9,8,5 };
int* ptr; // 定義一個(gè)int類型的指針變量ptr
ptr = arr;
std::cout << "arr[0]=" << arr[0] << std::endl;
std::cout << "*ptr=" << *ptr << std::endl;
std::cout << "arr[1]=" << arr[1] << std::endl;
std::cout << "*(ptr+1)=" << *(ptr + 2) << std::endl;
std::cout << "arr[2]=" << arr[2] << std::endl;
std::cout << "*(ptr+2)=" << *(ptr + 2) << std::endl;
return 0;
}
輸出結(jié)果:?
?注意:*ptr+1 與 *(ptr+1) 是有區(qū)別的,區(qū)別如下:(假設(shè)ptr指向arr數(shù)組的地址)
*ptr+1 :ptr存放的內(nèi)容是arr數(shù)組的地址,即arr數(shù)組中第一個(gè)元素的地址,*ptr存放的內(nèi)容是arr數(shù)組中第一個(gè)元素的值,則*ptr+1表示在第一個(gè)元素的值的基礎(chǔ)上加1。
*(ptr+1):同樣,ptr存放的內(nèi)容是arr數(shù)組的地址,即arr數(shù)組中第一個(gè)元素的地址,ptr+1存放的內(nèi)容是arr數(shù)組中第二個(gè)元素的地址,則*(ptr+1)存放的是第二個(gè)元素的值。
驗(yàn)證代碼如下:
#include <iostream>
int main() {
int arr[5] = { 1,3,9,8,5 };
int* ptr; // 定義一個(gè)int類型的指針變量ptr
ptr = arr;
std::cout << "arr[1]=" << arr[1] << std::endl;
std::cout << "*(ptr+1)=" << *(ptr + 1) << std::endl;
std::cout << "*ptr+1=" << *ptr + 1 << std::endl;
return 0;
}
輸出結(jié)果:?
????????上述代碼中, arr數(shù)組為一個(gè)可以存放5個(gè)int類型數(shù)據(jù)的一維數(shù)組,且5個(gè)元素分別為:1,3,9,8,5。
????????我們定義了一個(gè)int類型的指針變量ptr,并且將arr數(shù)組的地址,即第一個(gè)元素的地址賦給ptr,則有*(ptr+1)存放的是arr數(shù)組中第二個(gè)元素3,而*ptr存放的是arr數(shù)組中第一個(gè)元素1,那么*ptr+1就為2。
示例3:C ++指針和數(shù)組
C ++程序,用于插入和顯示使用指針符號輸入的數(shù)據(jù)。
#include <iostream>
using namespace std;
int main() {
float arr[5];
// 使用指針符號插入數(shù)據(jù)
cout << "輸入5個(gè)數(shù)字: ";
for (int i = 0; i < 5; i++) {
cin >> *(arr + i);
}
// 使用指針符號顯示數(shù)據(jù)
cout << "顯示數(shù)據(jù): " << endl;
for (int i = 0; i < 5; i++) {
cout << *(arr + i) << endl;
}
return 0;
}
輸出結(jié)果:?文章來源:http://www.zghlxwxcb.cn/news/detail-727944.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-727944.html
到了這里,關(guān)于C++ — 指針和數(shù)組的關(guān)系?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!