1. 程式人生 > >指標基本知識

指標基本知識

指標變數初始化

如:int a=5,*c=&a(a的地址賦值給了c,*c=5)
和以下等效:int a,*c;
           a=5;c=&a;(*c=&a是錯的)

不要訪問沒有被初始化的指標變數

如:int *p;
    cin>>*p;
因為p沒有初始化,p中可能存在一個不確定的單元地址,這時的輸入會改變原儲存單元的值,造成結果混亂。

指標作函式的引數

    例子: void swap(int *a,int*b)
    {
    int t;
    t=*a;
    *a=*b;
    *b=t;
    }
    程式碼裡交換的是x和y的值,記得帶上*號
呼叫時:
swap(&x,&y)這裡括號裡是xy的地址,有&

**計算一維陣列元素的平均值,並能帶回陣列中的最大值與最小值 **

double faver(int s[],int n,int *max,int *min)         //n為一維數組裡有幾個元素
   {
   double aver=s[0];
   *max=*min=s[0];
   for(int i=1;i<n;i++)
   {aver=s[i]+aver;                   //注意
   if(s[i]>*max)*max=s[i];
   if(s[i]<*min)*min=s[i];
   }
   return aver/n;
   }
   int main
   {
   int a[5]={80,89,67,76,98},max,min;
   double aver;                                 //因為平均數不一定是整數,所以aver定義為double型
   aver=faver(a,5,&max,&min);
   cout<<"max="<<max<<"min="<<min<<endl;
   cout<<"aver="<<aver<<endl;
   return 0;
   }

返回指標的函式

    如:“   using     namespace  std”  返回“using    namespace  std”
    知識:返回字串,就是返回字串的首地址
    例子:
    char *noblank(char *str)
    {
    while(*str==‘’)str++;
    return str;
    }
    int main()
    {
    char *s1=“   using namespace std”,*s2;
    s2=noblank(s1);
    cout<<s2<<endl;
    return 0;
    }
  ** 剛開始這裡有一些疑惑,為什麼輸出的是s2,不是*s2
    解答:如果指標指向存有字串的字元陣列的首地址,cout<<指標;顯示的是字串內容。這是規則問題。**

以下有兩個語法方面問題

#include <iostream>                                                 
using namespace std;    
int main()
{
char *s1="hahaha";
cout<<s1;
}

  #include <iostream>
using namespace std;
int main()
{
char s1[]="hahaha";               //不加*,就得有[]
cout<<s1;
} 
定義指標變數時,char *s1;cout<<s1就可輸出,若沒有*,cout<<s1就會出現錯誤

注意:整數、double陣列不能整體輸入、輸出。

int a[10]; 
cin>>a;  不正確
cout<<a;
字元陣列,char s[100];存字串,可以"整體"輸入輸出.
cin>>s;//正確,輸入字串
cout<<s;

指向函式的指標變數

例:double(*pf)(double)
    pf=sqrt;    //pf指向一個平方根函式
    這時,使用*pf可以呼叫該函式

這裡我也不是很清晰,學到後面再返回來看吧