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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

你知道char *s和char s[]的区别吗?

發布時間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你知道char *s和char s[]的区别吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在一個夜深人靜的晚上,有一個讀者給我發了一個C語言題目。他問我,發哥,幫我看看這個代碼有什么問題。我看了代碼之后,心里一陣恐慌。我自認為我不是C語言高手。但我確實是一個喜歡解決問題的男人。就是在這樣的背景驅使下,我寫下了這篇文章。

char *str1 = "hello"; char str2[] = "hello";

我們看這兩個定義。我們說這個是定義而不是聲明,是因為定義在內存里面分配了房子。而聲明,只給了個房產證卻不給你分房子。

str1 是 char *類型 。它是一個指針,這個指針指向一個字符串。

str2 是 char [] 類型。它是一個數組,他代表了這堆內存空間。

“hello”字符串在內存中是這樣存放的

我之前寫過一個不同變量地址分配在內存不同區域的文章,有不清晰的可以再回去看看。

str1 str3都是指向字符串的指針,而且這個字符串是保存在字符串常量區的。這個常量區里面的東西是不能被修改的。編譯器讓他們指向了同一個地址。這個地址保存的東西是 “hello”這個字符串。

大家看看下面這個代碼有什么問題?

#include "stdio.h" #include "stdlib.h" #include "string.h"int main(void) {char *str1 = "hello";char *str3 = "hello";char str2[] = "hello";memcpy(str3,"worldtest",strlen("worldtest")+1);printf("str1:%s str3:%s str2:%s\n",str1,str3,str2);str3 = "world";printf("str1:%s str3:%s str2:%s\n",str1,str3,str2);printf("hello,world\n");return (0); }

memcpy嘗試向一個非法的地址拷貝東西,這個是不允許的。為什么說這個地址非法呢?因為字符常量區里面的內容,只可以讀,不可以寫。

如果改成這樣的呢?應該輸出什么結果呢?

#include "stdio.h" #include "stdlib.h" #include "string.h"int main(void) {char *str1 = "hello";char *str3 = "hello";char str2[] = "hello";//memcpy(str3,"worldtest",strlen("worldtest")+1);printf("str1:%s str3:%s str2:%s\n",str1,str3,str2);str3 = "world";printf("str1:%s str3:%s str2:%s\n",str1,str3,str2);printf("hello,world\n");return (0); }

我之前在文章里面討論一個問題,我們說指針的時候,要說指針變量。指針變量保存的內容是一個地址。既然是變量,那么保存的地址是可以變化的。只要類型符合。都可以保存。

同樣的,在上面的例子中,如果我們嘗試這樣

str1[1] = 'a';

這樣也是錯誤的。這樣也是寫操作了非法的地址。

試試下面這段代碼

#include <stdio.h> int main(){char* str1="Hello";printf("\nstr1: %s, address: %p, sizeof(str1): %u", str1, str1, sizeof(str1));str1 = "world";printf("\nstr1: %s, address: %p, sizeof(str1): %u", str1, str1, sizeof(str1));return 1; }

輸出

str1: Hello, address: 0000000000404000, sizeof(str1): 8 str1: world, address: 0000000000404031, sizeof(str1): 8 -------------------------------- Process exited after 0.0226 seconds with return value 1 請按任意鍵繼續. . .

通過賦值運算后,str1的值也發生了改變。

但是str2情況會不一樣,str2是一個數組。

既然是數組,我們看看這段小代碼

#include<stdio.h> int main(){char str2[] = "hello";printf("\nstr2: %s, address: %p, sizeof(str2): %u", str2, str2, sizeof(str2));str2[2] = 'A';printf("\nstr2: %s, address: %p, sizeof(str2): %u", str2, str2, sizeof(str2));strcpy(str2, "world");printf("\nstr2: %s, address: %p, sizeof(str2): %u", str2, str2, sizeof(str2));return 1; }

輸出日志

str2: hello, address: 000000000062FE10, sizeof(str2): 6 str2: heAlo, address: 000000000062FE10, sizeof(str2): 6 str2: world, address: 000000000062FE10, sizeof(str2): 6 -------------------------------- Process exited after 0.04063 seconds with return value 1 請按任意鍵繼續. . .

送一個圖

晚上回來我寫了一個小程序。大家看看

#include <stdio.h> #include "stdlib.h" #include "string.h"const int a = 1; const int a1 = 1; char * s = "hello";int main() {const int b = 2;const int b1 = 2;char * s1 = "hello";printf("s:%p s1:%p\n",s,s1);printf("a:%p a1:%p b:%p b1:%p\n",&a,&a1,&b,&b1);return 1; }

輸出如下:

s:0000000000404008 s1:0000000000404008 a:0000000000404000 a1:0000000000404004 b:000000000062FE14 b1:000000000062FE10-------------------------------- Process exited after 0.03901 seconds with return value 1 請按任意鍵繼續. . .

可以看到,s,s1,a,a1在一個內存區域。這個內存區域的內容是不允許改變的。如果你對這里的內存區域賦值,就會出現段錯誤。

但是b和b1這個內存區域大家看看。我們可以寫個小代碼測試一下。

#include <stdio.h> #include "stdlib.h" #include "string.h"const int b = 2;int main() {const int b1 = 2;int *p = &b1;printf("b1:%d\n",b1);*p = 3;printf("b1:%d\n",b1);return 1; }

輸出:

b1:2 b1:3-------------------------------- Process exited after 0.0403 seconds with return value 1 請按任意鍵繼續. . .

但是我們寫成這樣呢?

#include <stdio.h> #include "stdlib.h" #include "string.h"const int b = 2;int main() {const int b1 = 2;int *p = &b;printf("b:%d\n",b);*p = 3;printf("b:%d\n",b);return 1; }

輸出:

b:2-------------------------------- Process exited after 3.743 seconds with return value 3221225477 請按任意鍵繼續. . .

如果放到gcc下,可以看到,執行到代碼

*p = 3;

會出現段錯誤。因為訪問了不能訪問的地址。這也就是我們很多時候給空指針賦值出現段錯誤的原因。操作了非法的地址。

好了,就瞎BB這么多,如果覺得有用,可以留言一起討論下。

? 回復「?籃球的大肚子」進入技術群聊

回復「1024」獲取1000G學習資料

總結

以上是生活随笔為你收集整理的你知道char *s和char s[]的区别吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 在线国产视频 | 上床视频在线观看 | 国产色婷婷 | www日本高清视频 | 污污的视频在线免费观看 | 国产在线观看av | 青草成人免费视频 | 久热网站| 永久免费不卡在线观看黄网站 | 影音先锋在线中文字幕 | 青青青av | 91超薄肉色丝袜交足高跟凉鞋 | 欧美群交射精内射颜射潮喷 | 人妻精品一区一区三区蜜桃91 | 午夜视频福利在线观看 | 久久久久国产精品国产 | www.毛片com | 亚洲成人av电影 | 成人精品免费看 | 中文字幕淫 | 免费观看黄色网址 | 欧美性区 | 玖玖视频网 | 久久精品视频免费观看 | 28一20岁女人一级 | 国产精品a级 | av电影在线观看 | 色图综合 | 国产精品嫩草久久久久 | 99黄色网 | www.精品| 中国a毛片 | 粉嫩小泬无遮挡久久久久久 | 精品国产成人av | 国产日韩欧美在线观看视频 | 日韩www在线观看 | 99re这里只有精品66 | 欧洲亚洲天堂 | 天天激情站 | 毛片免费一区二区三区 | 欧美色图亚洲色 | 吸咬奶头狂揉60分钟视频 | 欧美亚洲一区二区三区四区 | 亚洲熟妇av日韩熟妇在线 | 日本成人午夜 | 久草最新网址 | 国产成人一区二区三区 | 美女精品在线观看 | 黑人玩弄人妻一区二区三区 | 美女露出让男生揉的视频 | 久草视频免费 | 人人妻人人澡人人爽久久av | 国产欧美一区二区三区四区 | 天天看夜夜操 | 成人黄色免费看 | 99久久婷婷国产综合精品电影 | 精品免费国产一区二区三区 | 国产综合亚洲精品一区二 | www.亚色| 精品无码久久久久久久久成人 | 五十路japanese55丰满 | 麻豆视频传媒 | 久久精品男人的天堂 | 久久免费视频观看 | 四川话毛片少妇免费看 | 久久av高潮av无码av喷吹 | 黄色网页在线 | 熟女一区二区三区视频 | 婷婷亚洲综合五月天小说 | 性xxx法国hd极品 | 国产十八熟妇av成人一区 | av网站网址| 91精品国产色综合久久不卡电影 | 91挑色| 日韩草逼| 色天天综合网 | 亚洲色欧美| 欧美三级自拍 | 干爹你真棒插曲免费 | 涩涩视频网站在线观看 | 亚洲日本香蕉 | 成人免费午夜视频 | 久操福利视频 | 九草在线观看 | 精品国产aⅴ一区二区三区东京热 | 久操av| 日韩簧片| 精品久久9999 | 国产精品精品久久久久久 | 日韩中字在线 | 成人免费一区二区三区在线观看 | 日韩在线播放视频 | 精品福利一区 | 2020国产精品| 成人久久一区二区 | 99精品人妻少妇一区二区 | 亚洲国产一区二区三区四区 | 亚洲国产小视频 | 在线观看日本一区二区 |