char陣列與char指標的區別與聯絡 - 程式人生
文章推薦指數: 80 %
char s[10]="hello,world";//使用字串字面值(string literal)來初始化字元陣列(2)已經分配了記憶體,然後進行賦值。
char s[10]; s[0]='h',s[1]='e';
程式人生>>char陣列與char指標的區別與聯絡
char陣列與char指標的區別與聯絡
阿新••發佈:2019-01-25
字串(char*)與字元陣列(char[])區別
在C語言中,對字串的操作主要有兩種方式:一是字元陣列(char[]),二是使用字元指標(char*)。
接下來最這兩種所使用的情況做徹底的說明:
一、字元陣列字元陣列的定義有兩種方式:1.chars[n];n表示資料的大小。
該語句可以理解為宣告一個字元陣列,並且編譯器為該字元陣列分配n個記憶體空間,這是在編譯期進行的。
賦值有兩種方式:(1)宣告並初始化chars[10]="hello,world";//使用字串字面值(stringliteral)來初始化字元陣列(2)已經分配了記憶體,然後進行賦值。
chars[10];s[0]='h',s[1]='e';錯誤的賦值方式:(1)chars[];s="hello,world";//這表明僅僅聲明瞭一個char陣列,但是不知道分配多大記憶體空間。
(2)chars[10];s="hello,world";//錯誤s={'h','e','l','l','o'};//錯誤s是指向陣列首地址的指標。
二、字元指標可以使用char*str指向一個字串如:char*str="C++";//宣告一個指向char的指標並進行初始化。
char*str;//宣告一個指標。
str="C++";
三、兩者的區別
1.既然char*a只是定義了一個指標a,而並不為其指向的字串分配記憶體,那麼為什麼下面兩行程式碼又能夠編譯通過,且執行結果看上去是正常的?
char*a;
a="abcde";
這兩行程式的執行過程中,編譯器/計算機都做了些什麼?
在這兩行程式的基礎上,為什麼賦值語句*a='A'又是不合法的(會導致執行時錯誤)?
相比於上面兩行程式,以下兩行也是不合法的,為什麼?
chara[];
a="abcde";答:(1)char*a;這一行中編譯器做的事情是,宣告一個指向字元的指標,但是沒有讓該指標分配指向記憶體,它只是知道有一個變數a可能需要放在棧上;
假如後面需要取變數a的地址,那麼編譯器就被迫使a佔用棧空間.而假如編譯器決定使a不佔用棧空間就要給a在它需要保持值的期間保留一個
暫存器,在執行時計算機不為此做任何事情。
(2)a="abcde";//這一行中編譯器做的事情是在字元常量記憶體空間定義一個"abcde"字串,讓字元指標a指向此字元常量記憶體空間的地址。
由於該地址空間
不是在棧內,而存在類似於靜態儲存區這樣的空間。
(3)*a='A'之所以會在執行時發發生錯誤,是因為匿名陣列所在的儲存空間是不可寫的。
(4)chara[];a="abcde";//以上是不合法的。
首先,宣告陣列時如果沒有給變數初始化就必須指明陣列的長度。
其次,即使改成chara[6];a="abcde";也是不合法的,這是因為你不能將指標值賦給一個數組。
或者用一個更簡單的說法:型別不同,並且不存在一個隱式轉換使得char*被轉換成char[6]。
2.以下兩種初始化方式是否有本質區別?
chara[]="abcde";
char*b="abcde";
答:從效果上來說,上面兩個語句結果是一樣的,都獲取到字元的首地址。
但是本質是不一樣的,char陣列的初始化器會先為該陣列在棧內分配記憶體,
然後將匿名陣列的內容複製到物件所處的空間中char*的初始化器會首先在字串常量空間記憶體生成一個常量字串"abcde",然後將該字串的首地址
賦值給字元指標物件。
3.為什麼下面的程式碼
char*a,*b;
a="abcde";b="abcde";
其執行結果中,a和b會指向同一記憶體地址?而上一問中得到的a和b就不會指向同一記憶體地址。
答:不一定一樣,這取決於編譯器。
4.對於陣列宣告(或初始化)的變數,例如
chara[6];
或
chara[]="abcde";
這句話是否正確?當a作為右值(rvalue)時,其型別為char*;而當a作為左值(lvalue)時,其型別就是char[6]。
答:這句話是錯誤的。
從char[6]到char*有一個隱式轉換,這並不意味著a會有飄忽不定的型別。
我有這個疑問,是因為我試過幾次,發現以下程式碼可以正常執行
chara[]="abcde";
char*b;
b=a;
答:可以從char[]隱式轉換為char*型別,但是不可以從char*型別轉換到char[]型別。
而以下程式碼會導致型別轉換錯誤
char*a="abcde";
charb[6];
b=a;
甚至,以下程式碼也會導致型別轉換錯誤,且錯誤提示和上一段程式碼是一樣的
chara[]="abcde";
charb[6];
b=a;
5.對於函式引數中的char[]和char*是否一樣?
答:在C語言中,陣列作為引數,進行傳遞時,傳遞的是指標,換句話說,字元陣列作為引數,進行傳遞時,
傳遞的是字元陣列的起始地址,相當於一個字元指標,兩者沒有區別。
獲取請求IP
«上一篇
IDEA、PhpStorm系列破解辦法-Windows平臺下一篇»
相關推薦
字元陣列和字串的區別和聯絡
字串和字元陣列的區別和聯絡:
C語言中沒有用於表示字串的關鍵字以陣列形式將字串輸出
字串和字元陣列的區別和聯絡:C語言中沒有...
golang中陣列和切片的區別與聯絡
golang中陣列和切片的區別:
切片時指標型別,...
繼承與派生的區別和聯絡
繼承與派生其實是同一過程從不同的角度看,我們將保持已有類的特性而構造新類的過程稱為繼承,說白了繼承的目的就是實現原來設計與程式碼的重用,希...
vue.extend與vue.component的區別和聯絡
一味的悶頭開發,卻對基礎概念缺乏理解,是個大坑...查閱官網後現對自己的理解記錄一下,用於日後複習鞏固
Vue.extend({})簡述:使用vue.ext...
java分散式與叢集的區別和聯絡
一.先說區別:
一句話:分散式是並聯工作的,叢集是串聯工作的。
1.分散式是指將不同的業務分佈在不同的地方(微服務是為了滿足在不同微服務實現不...
MySQL主鍵與索引的區別和聯絡
關係資料庫依賴於主鍵,它是資料庫物理模式的基石。
主鍵在物理層面上只有兩個用途: 惟一地標識一行。
作為一個可以被外來鍵有效引用...
RTTI與反射的區別和聯絡
為什麼會有反射?
假如你在程式執行過程中,從磁碟上或者從網路上讀取接收了一串代表一個類的位元組,既然這個類在你的程式被編譯...
char陣列和char指標的使用區別和一些注意事項
const用法
constchar*p;表示p是一個指向常量字元的指標
char*constp;表示p是一個指向字元的常量指標...
chara[](字串陣列)和char*a(字串指標)區別
在C語言中,對字串的操作主要有兩種方式,一是使用字元陣列,charstr[];二是使用字元指標。
那麼二者有什麼區別呢?下...
指標與陣列字元指標,字串和字元陣列的區別
指標和陣列是不相等的,把一個數組名作為一個引數傳遞...
搜尋
基礎教學
Mysql入門
Sql入門
Android入門
Docker入門
Go語言入門
Ruby程式入門
Python入門
Python進階
Django入門
Python爬蟲入門
最近訪問
char陣列與char指標的區別與聯絡
v-model+用在組件中
jQuery根據ID、CLASS、等獲取物件
PHP建立資料夾
使用Mysql新版驅動的ReplicationDriver實現MySQL讀寫分離
VUE源碼解析心得
bs4原始碼
solr整理。
redis教程:redis的安裝與php擴充套件配置
Leetcode+367
延伸文章資訊
- 1指標與字串
在〈字元陣列與字串〉談過C 風格字串,本質上就是個字元陣列,而陣列名稱具有指標性質,那可以如下建立字串嗎? char *text =
- 2字串指標- C語言知識彙總 - IT人
一、字串指標C語言中沒有特定的字串型別,通常是將字串放在一個字元陣列中,這裡不妨演示一下: #include <stdio.h>#include <string.h>int main(){ ...
- 3char陣列與char指標的區別與聯絡 - 程式人生
char s[10]="hello,world";//使用字串字面值(string literal)來初始化字元陣列(2)已經分配了記憶體,然後進行賦值。 char s[10]; s[0]='h...
- 4C語言- 第二十二章| 指標- 指標與字串 - J.J.'s Blogs
字元指標可以參考至一個字串常數,這使得字串的指定相當的方便,例如下面的程式片段宣告一個字串指標,並指向一個字串常數。 1, char *str = "hello"; ...
- 5字串指標陣列詳解 - 程式人生
... 陣列整體的收地址,大小同下行程式碼的值 printf("%p\n",str);//陣列的首地址,即存放內容——字串"abg"的地址,並非'a'的地址 return 0; } /* 指標 ...