c++指针数组(入门)
指針數(shù)組的本質(zhì)是數(shù)組,只是每個(gè)數(shù)組的元素為指針
32位平臺(tái):
char*arr1[4]; int *arr2[4]; short *arr3[4];sizeof(arr1)==168; sizeof(arr2)==168; sizeof(arr3)==168;8.4.1 數(shù)值的指針數(shù)組
int *arr[4]; 指針數(shù)組
int *arr[4]={&num1,&num2,&num3,&num4};
? ? ? ? ? ?
int num1=10; int num2=20; int num3=30; int num4=40; //int arr[4] //int *p; int *arr[4]={&num1.&num2,&num3,&num4}; int n=sizeof(arr)/sizeof(arr[0]); int i; //遍歷輸出 for(int i=0;i<n;i++){ cout<<arr[i]<<" "; //10 20 30 40 } cout<<endl;? ? ? ? ? ? ? ? ? ? ? ? ?
8.4.2 字符指針數(shù)組
char*arr[4]={"hehehehe","xixixixi","lalalala","hahahaha"};arr[0]存放的是hehehehe的首元素地址,存放在棧區(qū)/全局區(qū)(看這個(gè)數(shù)組是全局還是局部),同時(shí),"hehehehe"被存放在文字長(zhǎng)量區(qū)。注意:文字長(zhǎng)量區(qū)的值不可被修改
char*arr[4]={"hehehehe","xixixixi","lalalala","hahahaha"}; int n=sizeof(arr)/sizeof(arr[0]); int i; for(i=0;i<n;i++){ cout<<arr[i]<<endl; //這里輸出不需要加*號(hào),arr[i]它保存的就是字符串首元素地址,輸出結(jié)果為 hehehehexixixixilalalala hahahaha} // cout<<*arr[i]; 輸出的就是第0個(gè)元素內(nèi)容,就是 h,x,l,h;// cout<<*(arr[i]+3)<<endl; 這里輸出的是字符串第三個(gè)元素,e,i,a,a8.4.3 二維字符數(shù)組
char*arr1[4]={"hehehehe","xixixixi","lalalala","hahahaha"}; char arr2[4][128]={"hehehehe","xixixixi","lalalala","hahahaha"};arr1是在指針數(shù)組 存放的是每個(gè)字符串的首元素地址
arr2是二維數(shù)組? ? 存放的是每個(gè)字符串
8.5 指針的指針
int num=10; int *p=# int **q=&p;如果想要保存p的地址,則需要兩個(gè)*號(hào)
n級(jí)變量可以保存n-1級(jí)指針變量的地址
8.6數(shù)組指針
int arr[5]={10,20,30,40,50}; int (*p)[5];//數(shù)組指針,注意()不能去掉,去掉就和5結(jié)合 #include<iostream> using namespace std; void test1() {int arr[5] = { 10,20,30,40,50 };int(*p)[5] = &arr;//數(shù)組指針cout << "sizeof(p)=" << sizeof(p) << endl;cout << "p=" << p << endl;cout << "p+1=" << p + 1; }int main() {test1();return 0;}??
int arr[5]={10,20,30,40,50}; int(*P)[5]=&arr; //數(shù)組指針*p==*&arr==arr;*和&抵消
對(duì)數(shù)組首地址取*==數(shù)組首元素地址
注意:若想取arr[2]內(nèi)容,必須*(*p+2)=*(*(p+0)+2)==*(p[0]+2)==p[0][2]
8.6.2二維數(shù)組和數(shù)組指針的關(guān)系
int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
| arr[0] (值為1,2,3,4) |
| arr[1]? (5,6,7,8) |
| arr[2]? ?(9,10,11,12) |
?8.8 指針與函數(shù)
8.8.1 指針變量作為函數(shù)的參數(shù)
如果想在函數(shù)內(nèi)部 修改外部變量的值 需要將外部變量的地址 傳遞給函數(shù)(重要)
案列1 單向傳遞之值傳遞
函數(shù)內(nèi)部 不能修改外部變量的值
#include<iostream> using namespace std; void setNum01(int data) { data=100; } void test1(){ int num=0; setNum01(num);//單向傳遞之 傳值 cout<<"num="<<num<<endl; //輸出結(jié)果為0.修改不成功 } int main(int argc,char*argv[]) { test1(); return 0; }案例2 單向傳遞之傳地址
函數(shù)內(nèi)部就可以修改外部變量的值
void setNum02(int *p)//int *p=# { *p=100; } void test2(){int num=0; setNum02(&num);//單向傳遞之傳地址 cout<<"num="<<num<<endl; //結(jié)果為100 }8.8.2 一維數(shù)組作為函數(shù)的參數(shù)
函數(shù)內(nèi)部想操作(讀或?qū)?#xff09;外部數(shù)組元素,將數(shù)組名傳遞給函數(shù)
注意:一維數(shù)組 作為函數(shù)的形參 會(huì)被優(yōu)化成指針變(面試中常用)
//void outIntArray(int arr[5], int n) { // 注意:一維數(shù)組作為函數(shù)的參數(shù) 會(huì)被編譯器 優(yōu)化成 指針變量void outIntArray(int *arr, int n) {cout << "內(nèi)部sizeof(arr)=" << sizeof(arr) << endl; for (int i = 0; i < n; i++) {cout << arr[i] << " ";} } void test02() {int arr[5] = {10,20,30,40,50};int n = sizeof(arr) / sizeof(arr[0]);cout << "外部sizeof(arr)=" << sizeof(arr) << endl; //20B//遍歷數(shù)組:outIntArray(arr,n);// 10 20 30 40 50 }int main() {test02();return 0;}?8.8.3 二維數(shù)組作為函數(shù)的參數(shù)
函數(shù)內(nèi)部 想操作 函數(shù)外部的二維數(shù)組 需要將二維數(shù)組名 傳遞給函數(shù)
二維數(shù)組 作為函數(shù)的形參 會(huì)被優(yōu)化成 一維數(shù)組
//void outputIntArray(int arr[3][4], int row, int col) { //二維數(shù)組作為函數(shù)的形參 會(huì)被優(yōu)化成 一維數(shù)組指針void outputIntArray(int ( * arr)[4],int row,int col){cout << "內(nèi)部sizeof(arr)=" << sizeof(arr) << endl;for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {cout << arr[i][j] << " ";}cout << endl;} } void test03() {int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };int row = sizeof(arr) / sizeof(arr[0]);int col = sizeof(arr[0]) / sizeof(arr[0][0]);cout << "外部sizeof(arr)=" << sizeof(arr) << endl;//遍歷數(shù)組outputIntArray(arr, row, col);}int main() {test03();return 0;}8.8.4 函數(shù)的返回值類型為 指針類型
將函數(shù)內(nèi)部的合法地址 通過(guò)返回值 返回給函數(shù)外部
int* getAddr(void) {int data = 20;//data在函數(shù)內(nèi)部,是局部變量,在函數(shù)被調(diào)用之后會(huì)被釋放//*p就等于在訪問(wèn)一個(gè)被釋放的空間,這時(shí)候就會(huì)出現(xiàn)段錯(cuò),操作非法空間return &data; //不要返回普通局部變量的地址 } void test04() {int* p = NULL;p = getAddr();cout << "p=" << *p;//結(jié)果會(huì)出現(xiàn)段錯(cuò),輸出不了 }int main() {test04();return 0;}修改之后為:
int* getAddr(void) {//int data = 20;//data在函數(shù)內(nèi)部,是局部變量,在函數(shù)被調(diào)用之后會(huì)被釋放//*p就等于在訪問(wèn)一個(gè)被釋放的空間,這時(shí)候就會(huì)出現(xiàn)段錯(cuò),操作非法空間static int data = 20;//添加局部靜態(tài)變量staticreturn &data; //不要返回普通局部變量的地址 } void test04() {int* p = NULL;p = getAddr();cout << "p=" << *p;//20 }int main() {test04();return 0;}? 8.9 函數(shù)指針
?函數(shù)名 代表函數(shù)的入口地址:
函數(shù)指針:本質(zhì)是一個(gè)指針變量 只是改變量 保存的是函數(shù)的入口地址
int myAdd(int x, int y) {return x + y; } void test05() {int(*p)(int x, int y) = NULL;//函數(shù)指針和函數(shù)入口地址建立關(guān)系p = myAdd;//通過(guò)p調(diào)用myAdd函數(shù)(函數(shù)+(實(shí)參))cout << p(10, 20); //30 }int main() {test05();return 0;}8.9.2 函數(shù)指針變量注意:
函數(shù)指針變量不要+1 無(wú)意義
不要對(duì)函數(shù)指針變量取*
8.9.3? 函數(shù)指針變量 使用typedef定義
int myAdd(int x, int y) {return x + y; } void test05() {typedef int(*FUN_abs)(int x, int y);FUN_abs p = NULL;//函數(shù)指針和函數(shù)入口地址建立關(guān)系p = myAdd;//通過(guò)p調(diào)用myAdd函數(shù)(函數(shù)+(實(shí)參))cout << p(10, 20); //30 }int main() {test05();return 0;}8.9.4 函數(shù)指針作為函數(shù)的參數(shù)
目的:讓算法功能多樣化
案例1:設(shè)計(jì)一個(gè)算法,完成加減乘除
int myAdd(int x, int y) {return x + y; } int mysub(int x, int y) {return x - y; } int mymul(int x, int y) {return x * y; } int mydiv(int x, int y) {return x / y; } int choice(int x, int y, int (*func)(int, int)) {return func(x, y); } void test07() {cout << choice(20, 30, myAdd) << endl;cout << choice(20, 30, mysub) << endl;cout << choice(20, 30, mymul) << endl;cout << choice(20, 30, mydiv) << endl; }int main() {test07();return 0;}總結(jié)
以上是生活随笔為你收集整理的c++指针数组(入门)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 福建计算机大学专业分数线,华侨大学计算机
- 下一篇: 3DevFest2015 珠海回顾!