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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

指针强化

發布時間:2023/12/10 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 指针强化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鐵律1:指針是一種數據類型

1)指針也是一種變量,占有內存空間,用來保存內存地址

測試指針變量占有內存空間大小

int a = 10;char *p1 = 100; //分配4個字節的內存char ****p2 = 100;int *p3 = NULL;p3 = &a;*p3 = 20; //間接的修改a的值////*就像一把鑰匙 通過一個地址(&a),去修改a變量的標示的內存空間
  

?

2)*p操作內存

在指針聲明時,*號表示所聲明的變量為指針

在指針使用時,*號表示 操作 指針所指向的內存空間中的值

???????? *p相當于通過地址(p變量的值)找到一塊內存;然后操作內存

???????? *p放在等號的左邊賦值(給內存賦值)?

???????? *p放在等號的右邊取值(從內存獲取值)

{int c;int *p3 = 20;c = *p3;//讀內存printf("c:%d \n", c);} View Code

3)指針變量和它指向的內存塊是兩個不同的概念

//含義1 給p賦值p=0x1111; 只會改變指針變量值,不會改變所指的內容;p = p +1; //p++

{
     不斷地給指針賦值,相當于不停地改變指針的指向
char *p4 = NULL;p4 = (char *)malloc(100);p4 = (char *)malloc(200); //0xcc11 }

                  

//含義2 給*p賦值*p='a'; 不會改變指針變量的值,只會改變所指的內存塊的值??

  • 如果我們要修改指針所指向的內存空間數據的時候,我們要保證這個可以修改才行。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>void *getStr() {char *p1 = NULL;p1 = "abcdefg";return p1; }void main() {char *p;p = getStr();//printf("%s \n ", p);*(p + 2) = 'j'; // 常量區的不能修稿printf("%s \n", p); }

//含義3 =左邊*p 表示 給內存賦值, =右邊*p 表示取值 含義不同切結!

//含義4 =左邊char *p?

//含義5 保證所指的內存塊能修改

?

4)指針是一種數據類型,是指它指向的內存空間的數據類型?

含義1:指針步長(p++),根據所致內存空間的數據類型來確定

p++=è(unsigned char )p+sizeof(a);

結論:指針的步長,根據所指內存空間類型來定。

????????

注意:???? 建立指針指向誰,就把把誰的地址賦值給指針。圖和代碼和二為一。????????

?????????????????? 不斷的給指針變量賦值,就是不斷的改變指針變量(和所指向內存空間沒有任何關系)。

?

?

/*指針做函數參數的問題: 指針是一種數據類型,是指它指向的內存空間的數據類型?
int getABC1(char *p1); int getABC1(char* p1); int getABC2(char ** p2); int getABC2(char * *p2); int getABC2(char **p2); int getABC3(char ***p3); int getABC4(char (*p4)[30]); int getABC4(char (*p4) [30]); int getABC5(char p5[10][30]); int getABC5(char p5[10][30]);//指針做函數參數 形參有多級指針的時候, //站在編譯器的角度 ,只需要分配4個字節的內存(32bit平臺) //當我們使用內存的時候,我們才關心指針所指向的內存 是一維的還是二維的
*/

?練習題:

?

訓練1劃出內存四區

void main26()

{

?????? char buf[100];

?????? //byte b1 = new byte[100];

?????? int a = 10; //分配4個字節的內存 棧區也叫臨時區

?????? int *p;//分配4個字節的內存

?????? p = &a; //cpu執行的代碼,放在代碼區

?

?????? *p = 20; //

?

?????? {

????????????? char *p = NULL; //分配4個字節的內存 棧區也叫臨時區

????????????? p = (char *)malloc(100); //內存泄露概念

????????????? if (p != NULL)

????????????? {

???????????????????? free(p);

????????????? }

?????? }

??????

?????? system("pause");

}

?

?

?

全局區代碼測試

char * getstring1()

{

?????? char *p1 = "abcde";

?????? return p1;

}

?

char * getstring2()

{

?????? char *p2 = "abcde";

?????? return p2;

}

?

?

void main()

{

?????? int i= 0;

?

?????? //指針指向誰就把誰的地址賦給指針變量。

?????? char *p1 = getstring1();

?????? char *p2 = getstring2();

?????? char *******??? p3 = NULL; //p3 是個變量

?

?????? //指針變量和它所執行的內存空間變量是兩個不同的概念

?????? strcmp(p1, p2);

?

?????? system("pause");

}

?

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>void main() {char buf[100];//byte b1 = new byte[100];int a = 10; //分配4個字節的內存 棧區也叫臨時區int *p;//分配4個字節的內存p = &a; //cpu執行的代碼,放在代碼區*p = 20; // printf("&a:%d \n", a); //20printf("*p:%d \n", *p); //20 {char *p = NULL; //分配4個字節的內存 棧區也叫臨時區p = (char *)malloc(100); //內存泄露概念if (p != NULL){free(p);}}system("pause"); } View Code

?

?

?

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> //全局區代碼測試 char * getstring1() {char *p1 = "abcde";return p1; }char * getstring2() {char *p2 = "abcde"; //編譯器自動認為這兩塊內存塊一樣return p2; } void main() {int i = 0;//指針指向誰就把誰的地址賦給指針變量。char *p1 = getstring1();char *p2 = getstring2();char ******* p3 = NULL; //p3 是個變量//*p1和*p2輸出相同地址printf("%d\n", p1);printf("%d\n", p2);//指針變量和它所執行的內存空間變量是兩個不同的概念 strcmp(p1, p2);system("pause"); } View Code

?

訓練2 劃出內存四區

void main01()

{

?????? char buf[100];

?????? //byte b1 = new byte[100];

?????? int a = 10; //分配4個字節的內存 棧區也叫臨時區

?????? int *p;//分配4個字節的內存

?????? p = &a; //cpu執行的代碼,放在代碼區

?

?????? *p = 20; //

?

?????? {

????????????? char *p2 = NULL; //分配4個字節的內存 棧區也叫臨時區

????????????? p2 = (char *)malloc(100); //內存泄露概念

????????????? if (p2 != NULL)

????????????? {

???????????????????? free(p2);

???????????????????? //p2 = NULL;? 若不寫,實驗效果,分析原

?

?

????????????? }

????????????? if (p2 != NULL)

????????????? {

???????????????????? free(p2);

????????????? }

?????? }

?

?????? system("pause");

}

?

不加時候:

?

?

解決辦法:

#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h>//野指針產生的原因 //指針變量和它所指向的內存空間變量是兩個不同的概念 // 釋放了指針所致的內存空間 但是指針變量本身沒有重置成null //造成釋放的時候 通過if (p1 != NULL)//避免方法: 1)定義指針的時候 初始化成nuLL 2)釋放指針所指向的內存空間后,把指針重置成NULL。 void main11() {char *p1 = NULL;p1 = (char *)malloc(100);if (p1 == NULL){return ;}strcpy(p1, "11112222");printf("p1:%s \n", p1);if (p1 != NULL){free(p1);p1 = NULL;}// if (p1 != NULL){free(p1);}printf("hello...\n");system("pause");return ; }

?

?

?

?

?

指針的特殊?和共享內存塊

#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h>void main() {//指針第一個位置不能用char *p1 = NULL;strcpy(p1, "abcdefg");printf("hello...\n");system("pause");return ; }void main02() {//看提示的值char *p1 = NULL;p1 = 0x00077;strcpy(p1, "abcdefg");printf("hello...\n");system("pause");return ; }

?

畫內存四區圖?指針的精華(很像函數調用)

#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h>void main() {char buff[128];int i;int j = 0;char *p2 = NULL;char *p1 = NULL;p1 = &buff[0];p1 = &buff[1];p1 = &buff[2];for ( i = 0; i < 10; i++){p1 = buff[i];}p2 = (char *)malloc(100);strcpy(p2, "abcdrfg2e42989");for ( i = 0; i < 10; i++){p1 = p2 + i;printf("%c ", *p1);printf("%c ", *p2);//p2 始終指向第一個元素 }system("pause");return; }

?

轉載于:https://www.cnblogs.com/yaozhenhua/p/9296699.html

總結

以上是生活随笔為你收集整理的指针强化的全部內容,希望文章能夠幫你解決所遇到的問題。

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