欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++指針和數(shù)組:字符和字符串、字符數(shù)組的關聯(lián)和區(qū)別

 更新時間:2022年12月23日 17:35:38   投稿:yin  
字符串是一種重要的數(shù)據(jù)類型,但是c語言并沒有顯示的字符串數(shù)據(jù)類型,因為字符串以字符串常量的形式出現(xiàn)或者存儲于字符數(shù)組中。在C++標準模板庫(STL)中提供了string類,實現(xiàn)了對字符串的封裝。

字符串的本質就是字符數(shù)組,將字符串作為字符數(shù)組來處理。字符數(shù)組和字符串都可以作為存放字符的數(shù)組,所以可以通過數(shù)組的下標訪問每一個字符。字符串比較正如在C++中可以用3種方法(字符數(shù)組、字符串(類)、字符指針)訪問一個字符串,比較字符串(內容)自然也有這三種基本形式。

字符串是一種重要的數(shù)據(jù)類型,但是c語言并沒有顯示的字符串數(shù)據(jù)類型,因為字符串以字符串常量的形式出現(xiàn)或者存儲于字符數(shù)組中。在C++標準模板庫(STL)中提供了string類,實現(xiàn)了對字符串的封裝。但是其實現(xiàn)原理還是居于字符和指針,要了解這個原理,我們先看一下有關字符數(shù)組、字符和字符串之間的一些關聯(lián)。

區(qū)別:字符數(shù)組的長度就是字符的總長度,而字符串會+1,是因為包含了最后的“\0”結束符。

一、字符指針、字符數(shù)組

字符指針

字符串指針變量本身是一個變量,用于存放字符串的首地址。而字符串本身是存放在以該首地址為首的一塊連續(xù)的內存空間中并以 \0 作為串的結束。

char *ps="C Language";

順序是:1.分配內存給字符指針;2.分配內存給字符串;3.將字符串首地址賦值給字符指針;

char *ps;  // ps 字符串指針,是指針,是一個變量

ps="C Language"; // ps 為字符串的首地址,利用 ps++ 可遍歷字符串,字符串存儲在以 ps 為開始地址的地段連續(xù)的內存空間中,并以 \0 作為字符串的結束。

這里有兩點需要考慮清楚的地方:

1、*a 只是指向一個字符。

舉例如下:

#include <stdio.h>
#include <stdlib.h>
 
int main(void){  
    char *a= "bcd" ;  
    printf("輸出字符:%c \n", *a);  /*輸出字符,使用"%c"*/
    printf("輸出字符:%c \n", *(a+1) );  /*輸出字符,使用"%c"*/
    printf("輸出字符串:%s \n", a); /*輸出字符串,使用"%s";而且a之前不能有星號"*"  */
    system("pause");  /*為了能看到輸出結果*/
}

運行結果如下:

輸出字符:b 
輸出字符:c 
輸出字符串:bcd

2、若字符串常量出現(xiàn)在在表達式中,代表的值為該字符串常量的第一個字符的地址。所以 hello 僅僅代表的是其地址。原聲明方式相當于以下聲明方式:

char *a;  
a="hello"; /*這里字符串"hello"僅僅代表其第一個字符的地址*/

字符數(shù)組

字符數(shù)組是由于若干個數(shù)組元素組成的,它可用來存放整個字符串。(即用字符數(shù)組來存放字符串)。

在 C 語言中,將字符串作為字符數(shù)組來處理。(C++中不是)

字符數(shù)組初始化的方法:

1). 可以用字符串常量來初始化字符數(shù)組:

char  str[]={"Iamhappy"};

可以省略花括號

char  str[]="Iamhappy";  # 系統(tǒng)自動加入 \0

注意:上述這種字符數(shù)組的整體賦值只能在字符數(shù)組初始化時使用,不能用于字符數(shù)組的賦值,字符數(shù)組的賦值只能對其元素一一賦值。

下面的賦值方法是錯誤的:

char str[20];
str="Iamhappy";

對字符數(shù)組的各元素逐個賦值。

char str[10]={'I','','a','m','','h','a','p','p','y'};

在 C 語言中,可以用兩種方法表示和存放字符串:

(1)用字符數(shù)組存放一個字符串

char str[]="IloveChina";

(2)用字符指針指向一個字符串

char *str="IloveChina";

兩種表示方式的字符串輸出都用:printf("%s\n", str);

%s 表示輸出一個字符串,給出字符指針變量名 str(對于第一種表示方法,字符數(shù)組名即是字符數(shù)組的首地址,與第二種中的指針意義是一致的),則系統(tǒng)先輸出它所指向的一個字符數(shù)據(jù),然后自動使 str 自動加 1,使之指向下一個字符...,如此,直到遇到字符串結束標識符 \0 。

二、字符串指針

string* str 可以賦值:

string* str = {"hello", "world"}; 
//  對比與 char *name = "wang" = {'w','a','n','g'}
//  *(str) = "hello", *(str+1) = "world"
//  *(*(str)+1) = 'e'

也就是說每個元素都是 string 類型的,跟 char* 是不一樣的,不過 string* 可以用 char** 來代替:

string = char*, string* = char**

三、(字符串)指針數(shù)組

實例

#include <stdio.h>
void main()
{
    char *str[] = {"Hello", "C++", "World"}; //char (*str)[] = ...
    int i;
    for(i=0; i<3; i++)
        printf("%s\n", str[i]);
} 
// str[0]字符串"hello"的首地址,str[0]+1:字符串"hello"第二個字符'e'的地址,str[2]=str+2:第三個字符串"world"的首地址
// str[1]字符串"C++"的首地址
// str[2]字符串"world"的首地址

實例

#include <stdio.h>
#include <string.h>
int main()
{
   char *str[] = {"Hello", "C++", "World"};
   char **p;
   for(p=str; p<str+3; p++)
     puts(*p); #*p為字符串首地址,*p[0]為字符串的第一個字符地址
}

實例

#include<stdio.h>
#include<stdlib.h>
int main()
{
    char *str[3]={"Hello","C++","World"};
    printf("%s,%s,%c",str[0],str[0]+1,*(*(str+2)+1));
    system("pause");
}

結果為:

Hello,ello,o

格式:char* na[N] = {"li", "zh", "li", "zh", "li"};

char *a[]:表示a是數(shù)組,數(shù)組中的元素是指針,指向char類型,(數(shù)組里面所有的元素是連續(xù)的內存存放的) 數(shù)組名是數(shù)組第一個字節(jié)的內存地址,并且數(shù)組名a也表示指針。所以a 并不表示a地址存儲的內容, 而是a地址本身。

a+1:表示 a 的第二個元素的內存地址, 所以是加 8 字節(jié)。( 因為a的元素是char 指針, 所需要的空間為8字節(jié)(64位內存地址)。 )

*(a+1):則表示a這個數(shù)組的第二個元素的內容 (是個char 類型的指針,本例表示為world字符串的地址)。

*(*(a+1)):則表示a這個數(shù)組的第二個元素的內容(char指針)所指向的內容(w字符).

char * a[10]:表示限定這個數(shù)組最多可存放10個元素(char指針), 也就是說這個數(shù)組占用10*8 = 80字節(jié)。

#w:        a+1   =>   *(a+1)  =>   *(a+1)[0]
           指針(地址)   指針內容(字符串)      字符

四、總結

char *argv:理解為字符串
char **argv:理解為字符串指針
char *argv[]:字符串指針數(shù)組

int main(int argc, char*argv[]) 這是一個典型的數(shù)組名(或者說是指針數(shù)組)做函數(shù)參數(shù)的例子,而且還是沒有指定大小的形參數(shù)組。

有時為了再被調用函數(shù)中處理數(shù)組元素的需要,可以另設一個形參,傳遞需要處理的數(shù)組元素的個數(shù)。而且用數(shù)組名做函數(shù)實參時,不是吧數(shù)組元素的值傳遞給形參,而是把實參數(shù)組的首元素的地址傳遞給形參數(shù)組,這樣兩個數(shù)組久共同占有同一內存單元。 和變量作函數(shù)參數(shù)的作用不一樣。

可以去看看關于數(shù)組作為函數(shù)參數(shù)和指針數(shù)組作main函數(shù)形參方面的例子。譚浩強的那本書講的很細,對這個有詳細的解釋。

1. 當 char [] 作為函數(shù)的參數(shù)時, 表示 char *. 當作為函數(shù)的參數(shù)傳入時, 實際上是拷貝了數(shù)組的第一個元素的地址。

所以 void test (char a[]) 等同于 void test ( char * a )

char x[10] ;

然后調用 test(x) 則等同于把 x 的第一個元素的地址賦予給參數(shù) a。

2. char * a 和 char a[]

  • 相同點 : a都是指針, 指向char類型。
  • 不同點 : char a[] 把內容存在stack。char *a 則把指針存在 stack,把內容存在 constants。

3. char * a[10] 和 char a[10][20]

  • 相同點 : a 都是2級指針, *a 表示一級指針, **a 表示內存中存儲的內容。
  • 不同點 : char * a[10], 數(shù)組由char * 類型的指針組成; char a [10][20] 表示一位放10個元素, 二維放20個元素, 值存放地是一塊連續(xù)的內存區(qū)域, 沒有指針。

4. 小竅門 : [] 和 * 的數(shù)量對應, 如 char a[][] 的指針層數(shù)是 2, 相當于 char **a; char *a[] 也是如此, 兩層指針. 迷糊的時候數(shù)數(shù)到底有幾個 * 幾個 [], 就知道什么情況下存儲的是內容還是地址了 ? 如 char a[][] 的情況里面: &a, a, *a 都是地址, **a 是內容。

到此這篇關于C++指針和數(shù)組:字符和字符串、字符數(shù)組的關聯(lián)和區(qū)別的文章就介紹到這了,更多相關C++字符和字符串、字符數(shù)組內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺析C語言中assert的用法

    淺析C語言中assert的用法

    以下是對C語言中assert的使用方法進行了介紹,需要的朋友可以參考下
    2013-07-07
  • c++字符串分割的方法

    c++字符串分割的方法

    這篇文章主要介紹了c++字符串分割的方法,幫助大家更好的理解和學習c++,感興趣的朋友可以了解下
    2020-08-08
  • C++11新特性中auto 和 decltype 區(qū)別和聯(lián)系

    C++11新特性中auto 和 decltype 區(qū)別和聯(lián)系

    這篇文章主要介紹了C++11新特性中auto 和 decltype 區(qū)別和聯(lián)系的相關資料,需要的朋友可以參考下
    2017-01-01
  • C語言中的指針以及二級指針代碼詳解

    C語言中的指針以及二級指針代碼詳解

    這篇文章主要介紹了C語言中的指針以及二級指針代碼詳解,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • c++中的兩種getline用法詳解

    c++中的兩種getline用法詳解

    c++中有2種getline函數(shù),一種在頭文件 <istream> 中,是istream類的成員函數(shù);另一種是在頭文件 <string> 中,是普通函數(shù)。這篇文章主要介紹了c++中的兩種getline用法,需要的朋友可以參考下
    2020-02-02
  • C語言基礎應用處理學生打分?計算時間?最少硬幣問題詳細過程

    C語言基礎應用處理學生打分?計算時間?最少硬幣問題詳細過程

    很多的問題其實可以用編程來解決作答,本篇文章帶你用C語言解決最少硬幣問題、計算已經(jīng)過去了多久、學生成績自動打分來做基礎的訓練
    2022-02-02
  • 詳解C語言未初始化的局部變量是多少

    詳解C語言未初始化的局部變量是多少

    這篇文章主要給大家介紹了關于C語言未初始化的局部變量是多少,文中通過示例代碼以及圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-07-07
  • c++將字符串轉數(shù)字的實例方法

    c++將字符串轉數(shù)字的實例方法

    在本篇文章里小編給大家整理的是關于c++將字符串轉數(shù)字的實例方法,有需要的朋友們可以參考下。
    2020-02-02
  • C++?AVL樹插入新節(jié)點后的四種調整情況梳理介紹

    C++?AVL樹插入新節(jié)點后的四種調整情況梳理介紹

    AVL樹是高度平衡的而二叉樹,它的特點是AVL樹中任何節(jié)點的兩個子樹的高度最大差別為1,本文主要給大家介紹了C++如何實現(xiàn)AVL樹,需要的朋友可以參考下
    2022-08-08
  • C語言數(shù)據(jù)的存儲超詳細講解下篇浮點型在內存中的存取

    C語言數(shù)據(jù)的存儲超詳細講解下篇浮點型在內存中的存取

    使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內存位置。這意味著,當您創(chuàng)建一個變量時,就會在內存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內存和決定在保留內存中存儲什么
    2022-04-04

最新評論