c++中使用new動態分配存儲空間

下面這個例子,檢驗new給double型數組分配的存儲空間的首地址是多少。s是指向這個數組的指針,s+1即是指針移動一位,指向下一個元素。
[root@sparkmaster test]# cat NewArray.cpp
#include <iostream>

int  main()
{
  double * s;
  int i;
  s = new double[10];  //分配一片存儲空間給s,s指向這片空間的首地址。這片空間將要存的是10個double型數值

  std::cout<<"Before giving value,s is "<<s<<",";//打印首地址
  std::cout<<"*s is "<<*s<<"\n";//還未給數組賦初值,查看s指針指向的空間的值是多少
  if( !s )
        {
         std::cout<<"Allocation failure!\n";
         return 0;
        }
//給數組賦初值
  for(i = 0; i < 10; i++)
        s[i] = 100.00 + i;
  std::cout<<"After giving value:\n";
//把10個數組元素的地址以及元素值打印出來
  for(i = 0; i < 10; i++)
  {
        std::cout<<"&s["<<i<<"]="<<&s[i]<<"\n";
        std::cout<<"s["<<i<<"]="<<s[i]<<"\n";
  }
//s還是指向數組的首地址
  std::cout<<"s is "<<s<<"\n";
//s指針每加1,即指向數組的下一個元素
  for(i = 1; i < 10; i++)
  {
        s = s + i;
        std::cout<<"s+"<<i<<" is:"<<s<<"\n";
        s = s - i;
  }
  delete s;
  return 1;
}


執行結果如下:
[root@sparkmaster test]# g++ -o newarray NewArray.cpp
[root@sparkmaster test]# ./newarray
Before giving value,s is 0x17aa010,*s is 0
After giving value:
&s[0]=0x17aa010
s[0]=100
&s[1]=0x17aa018
s[1]=101
&s[2]=0x17aa020
s[2]=102
&s[3]=0x17aa028
s[3]=103
&s[4]=0x17aa030
s[4]=104
&s[5]=0x17aa038
s[5]=105
&s[6]=0x17aa040
s[6]=106
&s[7]=0x17aa048
s[7]=107
&s[8]=0x17aa050
s[8]=108
&s[9]=0x17aa058
s[9]=109
s is 0x17aa010
s+1 is:0x17aa018
s+2 is:0x17aa020
s+3 is:0x17aa028
s+4 is:0x17aa030
s+5 is:0x17aa038
s+6 is:0x17aa040
s+7 is:0x17aa048
s+8 is:0x17aa050
s+9 is:0x17aa058

可見,數組的元素地址跟指針是一一對應的,s[0]的地址即是s指針的內存,s[1]的地址即是s+1指針的內容。那爲什麼s+1,地址卻不是加1,實際是8(0x17aa020-0x17aa018=0x8)?哦對了,因爲double類型的單位長度是8 byte!
另外,此例也驗證了,如果s是指向數組的指針,s[i]即是數組中第i個元素的值,而不是*s[i],實際上*s[i]是個非法表示。若要表示s[i]元素的地址,應該是&s[i].

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章