一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

一道題看指針和數(shù)組的工作原理

 accesine 2005-10-14
一道題看指針和數(shù)組的工作原理

#include <iostream>
#include <stdlib.h>
using namespace std;
void f(int n[])
{
 int i = sizeof(n);
 cout << n << endl;
 n++;    //ok
 cout << n << endl;
 cout << "The size of n is:" << sizeof(n) << endl;
}
int main()
{
 int m[5]={1,2,3,4,5};
 int *p = m;
 int *q=NULL;
 char cc=‘a(chǎn)‘;
 char dd=‘v‘;
 cout <<"The address of m is:"<<(int)m<<endl;
 cout <<"The address of p is:"<<p<<endl;
 ++p;
 cout <<"The address of p is:"<<p<<endl;
 f(p);
 cout <<"The address of p is:"<<p<<endl;
   //m++;     //error
 cout <<"sizeof m is:"<<sizeof(m)<<endl;
 cout <<"m is:"<<p[0]<<endl;
 cout <<"The address of q is:"<<&q<<endl;
 cout <<"The content of q is:"<<(int)q<<endl;
// cout <<"The value of q is:"<<*q<<endl;   // error
 cout <<"The address of cc is:"<<(int)&cc<<endl;
 cout <<"The address of dd is:"<<(int)&dd<<endl;
    getchar();
 return 0;
    
}

用dev-c++運行結(jié)果如下:

The address of m is:2293584
The address of p is:0x22ff50
The address of p is:0x22ff54
0x22ff54
0x22ff58
The size of n is:4
The address of p is:0x22ff54
sizeof m is:20
m is:2
The address of q is:0x22ff48
The content of q is:0
The address of cc is:2293575
The address of dd is:2293574

我們發(fā)現(xiàn),打印的地址越來越小,為什么?

C語言的3個主要存儲區(qū)為:堆、棧、全局區(qū);其中堆是程序員自己分配的,必須程序員自己手工釋放,比如malloc/free。棧是系統(tǒng)管理的,自己釋放。像函數(shù)中的形參、局部變量都是在棧里,而且(大部分編譯器中)棧是由高地址向底地址生長,像一個倒扣的捅一樣,參數(shù)進棧的順序是先進后出。所以上面打印的地址越來越小。

//m++;     //error

這句話為何報錯?因為數(shù)組名只是個常量,編譯器沒為它分配空間,所以不能++

// cout <<"The value of q is:"<<*q<<endl;   // error

這句話為何報錯,因為q是一個空指針,空指針的概念是:指針中的內(nèi)容為0

我們可以看下面一個小例子:

int i=10;

int * q= = &i;                          

 其示意圖為:     

××××:××××

××××:10

也即:     

 q本省自己的地址:i的地址

                  i的地址:10

q本身的地址可以用&q得到

q指針中的內(nèi)容可以用(int)q得到,即i的地址
q指針所指向的直可以通過*q得到,即10;本例中:

 cout <<"The address of q is:"<<&q<<endl;
 cout <<"The content of q is:"<<(int)q<<endl;
就是這意思。

但是本題中,我們是這樣定義  int *q=NULL;這時q指針中所存的地址為0,我們又知道,0地址的內(nèi)容是操作系統(tǒng)保護的,不能訪問,所以想通過0地址去訪問值是錯誤的,也即此時*p報錯。

所以// cout <<"The value of q is:"<<*q<<endl;   一句是錯誤的

最后我們說說為什么2次sizeof結(jié)果不一樣,一次為20,一次為4

在主函數(shù)中的sizeof是算一個數(shù)組的大小,數(shù)組的大小=數(shù)組元素個數(shù)*類型大??;即5*4=20,int類型在32位平臺下是4字節(jié)大小。

在一個函數(shù)中,如果用數(shù)組名做形參,那么編譯器會把其退化為一個指針對待,所以sizeof結(jié)果為4,正好是一個指針的大小。所以我們在f函數(shù)中可以寫:n++,而在main中m++卻報錯,就是這個原因,一個是指針,一個是數(shù)組,指針是變量可以修改,數(shù)組名是常量,不可以修改。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲中文字幕高清乱码毛片| 自拍偷女厕所拍偷区亚洲综合| 91亚洲人人在字幕国产| 东京热男人的天堂一二三区| 日韩一区二区三区在线欧洲| 色哟哟哟在线观看视频| 开心五月激情综合婷婷色| 日韩人妻免费视频一专区| 99久久人妻精品免费一区| 麻豆精品在线一区二区三区| 国产欧美一区二区久久| 欧美色婷婷综合狠狠爱| 国产激情国产精品久久源| a久久天堂国产毛片精品| 91人妻人人精品人人爽| 日韩不卡一区二区视频| 亚洲精品黄色片中文字幕| 视频在线免费观看你懂的| 国产精品免费无遮挡不卡视频| 中文字幕日韩精品人一妻| 国产精品偷拍一区二区| 午夜精品在线视频一区| 91精品欧美综合在ⅹ| 国产精品伦一区二区三区在线| 国产视频一区二区三区四区| 国产av熟女一区二区三区蜜桃| 国产欧美日韩精品一区二区| 精品视频一区二区三区不卡| 日韩性生活片免费观看| 99久久国产综合精品二区 | 色狠狠一区二区三区香蕉蜜桃| 国产乱人伦精品一区二区三区四区| 国产毛片不卡视频在线| 亚洲高清亚洲欧美一区二区| 男女午夜视频在线观看免费| 在线免费国产一区二区三区| 欧洲偷拍视频中文字幕| 国产级别精品一区二区视频| 又黄又硬又爽又色的视频 | 国产高清在线不卡一区| 亚洲精品偷拍视频免费观看|