8.1 指針
8.1.1 變量與指針
在c++中定義一個整型變量i,它需要4個字節,其內存就好像帶有編號的小房間,所以編譯器爲變量i分配了編號爲1000~1003的小房間,如圖8.1所示。、
在程序代碼中是通過變量名對內存單元進行存取操作,但是代碼經過編譯後已經將變量名轉換爲該變量在內存中的存放地址,對變量值的存取都是通過地址進行的。
一個變量的地址稱爲該變量的指針,如果一個變量專門用來存放另一個變量的地址,這就是指針變量。
指針是一種數據類型,通常說的指針就是指針變量,它是專門用來存放地址的變量,而變量的指針主要指的是變量的地址。
1、指針的聲明
數據類型標識符 *指針變量名
例如
int *p_ipoint;//聲明一個整數指針
float *a,*b;//聲明一個浮點指針
2、指針的賦值
int i=100;
int *p_point=&i;
3、關於指針使用的說明
(1)指針變量名是p,而不是*p。
p=&i的意思是取變量i的地址賦值給指針變量p。
例如8.1 輸出變量的地址
#include <iostream>
#include<stdio.h>
using namespace std;
int main()
{
int i=100;
int *p=&i;
printf("%d\n",p);//獲取地址值
return 0;
}
結果
(2)指針變量不可以直接賦值。例如:
int a=100;
int *p;
p=100;
這樣編譯不會通過,會出現“error C2440:‘=’:cannot convert from ‘const int’ to ‘int *’ ”的錯誤提示。
(3)不能將 *p當作變量使用。例如:
int a=100;
int *p;
*p=100;//指針沒有獲得地址
printf("%d",p);//出錯語句
printf("%d",*p);//出錯語句
上面的代碼可以編譯通過,但運行時會彈出錯誤對話框。
例子8.2 使用指針比較兩個數的大小。
#include <iostream>
using namespace std;
int main()
{
int a,b;
int *p,*p1,*p2;
cout << "input a:" << endl;
cin>>a;
cout << "input b:" << endl;
cin>>b;
p1=&a;p2=&b;
if(a<b)
{
p=p1;
p1=p2;
p2=p;
}
cout<<"a="<<a;
cout<<" ";
cout<<"b="<<b;
cout<<endl;
cout<<"max="<<*p1<<",min="<<*p2<<endl;
return 0;
}
運行結果:
8.1.2指針運算符和取地址運算符
1、取地址運算符和指針運算符簡介
*是指針運算符,&是取地址運算符。
取地址運算符可以使得指針得到變量的地址;指針通過指針運算符可以得到地址所對應的數值。
例子8.3 輸出指針對應的數值。
#include <iostream>
using namespace std;
int main()
{
int a=100;
int *p=&a;
cout<<"a=:"<<a<<endl;
cout<<"*p=:"<<*p<<endl;
}
2、指針變量初始化
聲明並初始化指針變量時用到了*和&兩個運算符。例如
int *p=&a;
該語句等同於如下語句:
int *(p=&a);
3、區別
&和*的運算符優先級別相同,按自右向左的方向結合,因此&*p是先進行 *計算,*p相當於變量a,在進行&計算,&*a就相當於取變量a的地址。 * &a是先運算變量a的地址,然後運算指針運算符,最後取變量a所在地址的值,也就是a。
8.1.3 指針運算
指針變量儲存的是地址值,對指針做運算就等於對地址做運算。
例子8.4 輸出指針運算後的地址值。
#include <iostream>
#include<stdio.h>
using namespace std;
int main()
{
int a=100;
int *p=&a;
printf("address:%d\n",p);
p++;
printf("address:%d\n",p);
p--;
printf("address:%d\n",p);
p--;
printf("address:%d\n",p);
}
結果
指針進行一次加1運算,其地址值並沒有加1,而是加4,這和聲明指針的類型有關。
8.2 指針和數組
通過指針引用數組,就要先聲明數組,在聲明一個指針
int a[10];
int *p;
p=&a[0];
上面的程序意思就是將數組a[0]的地址賦給了指針p。
例子8.5通過指針變量獲取數組中的元素
#include <iostream>
using namespace std;
int main()
{
int i,a[10];
int *p;
for(i=0;i<10;i++)
{
a[i]=i;
}
p=&a[0];
for(i=0;i<10;i++,p++)
{
cout << *p<< endl;
}
return 0;
}
上述代碼意思就是:如果指針已經指向數組中的一個元素,則p+1指向同一個數組的下一個元素。p+i和a+i是a[i]的地址。