日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第三天2017/03/30(下午:二级指针的(输出)内存模型)

發布時間:2025/3/21 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第三天2017/03/30(下午:二级指针的(输出)内存模型) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【備用知識——字符串的操作】
模塊講解:數組、數組指針

void *memset(void *s, int ch, size_t n);
函數解釋:將s中當前位置后面的n個字節 (typedef unsigned int size_t )用 ch 替換并返回 s 。
memset:作用是在一段內存塊中填充某個給定的值,它是對較大的結構體或數組進行清零操作的一種最快方法

1) 數組首元素的地址和數組地址是兩個不同的概念(類型決定步長!) 例:int a[10];a:代表數組首元素的地址 (a代表數組元素類型,即a[0])&a:數組的地址(&a代表數組類型,即int [10])(2)以一維數組為例 #include <iostream> using namespace std; int main() { //①定義數組typedef int(MTYPE)[5];//講解此句話的含義MTYPE array; //等價于int array[5];for(int i = 0; i<5; i++){array[i] = i;cout<<array[i]<<endl;}//定義一個指向數組類型的指針的三種方式//②:用定義的數組類型MTYPE定義數組指針變量(方式一)MTYPE *pArr = &array; //pArr指向數組類型(即指向&array,而不是指向數組元素)for(int i = 0; i<5; i++){cout<<(*pArr )[i]<<endl;}//②:定義一個數組指針類型pMTYPE,用pMTYPE定義數組指針變量(方式二)typedef int(*pMTYPE)[5]; //類比typedef int(MTYPE)[5];//講解此句話的含義pMTYPE ptr = &array; //此處的 *ptr = 數組的地址,即&array。//②:直接定義一個數組指針ptrArr(方式三)char (*ptrArr)[5]; //ptrArr是一個指向char[5]數組的指針,它指向數組,而不是指向數組的元素,因此給它賦值時用數組的地址,而不是數組元素的地址。ptrArr = &array; //注意:此處不是array(&array[0]數組首元素的地址),而是&array(數組的地址)//數組指針ptrArr的使用:首先把一個數組地址賦值給數組指針ptrArr然后用(*ptrArr)去取出該數組的地址最后進行使用,使用方式(*ptrArr)[i] } 【解讀】 typedef int(MTYPE)[5];的含義(3)※【重點來了】數組名加一增加的步長是多少?(【注】多維數組和一維數組不同) #include <iostream> using namespace std; int main() {//一維數組int c1[5] ; cout<<(int)c1 <<endl;cout<<(int)(c1+1)<<endl; //一維數組的數組名+1,地址增加一個元素sizeof(c1[i])的大小//二維數組int c2[3][5];cout<<(int)c2 <<endl;cout<<(int)(c2+1)<<endl; //二維數組的數組名+1,地址增加 5*sizeof(c2[i][j]) 的大小【總結】 // 一維數組的數組名代表首元素的地址,相當于&c1[0];因此c1+1的地址增量是sizeof(int)// 二維數組的數組名表示對應的數組指針,相當于int (*c2)[5];因此c2+1的地址增量是sizeof(int [5]) // 三維數組的數組名表示對應的數組指針,相當于int (*c2)[5][4];因此c3+1的地址增量是sizeof(int [5][4]) // 以此類推到N維數組【綜上所述】一維數組名自成一派,多維數組名實質上表示的是數組指針。getchar(); } 常見返回值問題 char* getchar() {//char *p1 = "AAAA"; //常量區//return p1; //返回成功char p2[100] = "AAAA"; //局部變量區return p2; //返回失敗 }

==============================================
二級指針的(輸出)內存模型

//在被調函數中分配內存,把結果給甩出來(甩給主調函數) //這種模型:實參是地址或者引用 #include <iostream> using namespace std; //二級指針的輸出模型 struct student {char name[100];int age; }; struct student* create1() {struct student* s = (struct student*)malloc(sizeof(struct student)); //在被調函數中分配內存return s; }int create2(struct student** s) {if(s==NULL) //如果傳進去的實參是無效的值(即傳進去的實參的地址是NULL), 而不能用 if(*s==NULL)return 0;*s = (struct student*)malloc(sizeof(struct student));return 1; } int main() { //形式一struct student *stu1 = NULL;stu1 = create1();//形式二struct student *stu2 = NULL;create2(&stu2);return 0; }

二級指針的易犯錯誤模型以及相關知識

(1)char buf[100];//buf是const常量,不能被修改 (2)編譯器會把p[i]轉換成*(p+i)

總結

以上是生活随笔為你收集整理的第三天2017/03/30(下午:二级指针的(输出)内存模型)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。