1. 程式人生 > >C 字串陣列和char*指標在做&操作時的區別

C 字串陣列和char*指標在做&操作時的區別

在做HMAC編碼時發現一個詭異的問題,結果是由於C 字串陣列和char*指標在做&操作時的區別導致的,HMAC編碼時發現的問題見這裡。本文介紹C 字串陣列和char*指標在做&操作時的區別。

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

int main(int argc, char * argv[]) {
        char buff[] = "hello";
        printf("buff: %p\n", buff);
        printf("&buff: %p\n", &buff);
        for(int i = 0; i < strlen(buff) + 1; ++i) {
                printf("%-03x", (unsigned int)buff[i]);
        }
        cout << endl;

        char * pBuff = (char *)malloc(strlen("hello") + 1);
        memset(pBuff, 0, strlen("hello") + 1);
        strcpy(pBuff, "hello");
        cout << "pBuff: " << pBuff << "~" << endl;

        printf("pBuff: %p\n", pBuff);
        printf("&pBuff: %p\n", &pBuff);

        free(pBuff);

        return 0;
}
上面的程式碼的一次執行結果是:
buff: 0x7fffde8fe990
&buff: 0x7fffde8fe990
68 65 6c 6c 6f 0
pBuff: hello~
pBuff: 0x7ef010
&pBuff: 0x7fffde8fe988
這說明,對於陣列char buff[] = "hello",將buff 和 &buff 用指標形式輸出,結果是一樣的!而對於指標pBuff,將pBuff 和 &pBuff 用指標形式輸出,結果是不一樣的!

後者好理解,“指標的值”和“存放指標變數的地址”當然不能指望它們是一樣的了,除非這個指標指向它自己!

對於陣列char buff[] = "hello"

,buff 和 &buff 的指標形式輸出值都是那個陣列的首地址。這說明,buff 作為一個 char * 的指標,它指向陣列的首地址;對於 &buff 這樣的操作,這裡的buff 代表的是整個陣列,而不是一個指標,&buff 實際上是去獲取陣列的地址,於是我們看到了相同的輸出值!

相關推薦

C 字串陣列char*指標&操作區別

在做HMAC編碼時發現一個詭異的問題,結果是由於C 字串陣列和char*指標在做&操作時的區別導致的,HMAC編碼時發現的問題見這裡。本文介紹C 字串陣列和char*指標在做&操作時的區別。 #include <string.h> #inclu

char a[](字串陣列)char *a(字串指標)區別

在C語言中,對字串的操作主要有兩種方式,一是使用字元陣列,char str[];二是使用字元指標。那麼二者有什麼區別呢?下面將分述二者的使用,最後進行比較。 一、字元陣列         使用char str[]定義一個字元陣列str,中括號內可以寫上數字表示陣列大

char陣列char指標的使用區別一些注意事項

const用法 const char* p;表示p是一個指向常量字元的指標 char* const p;表示p是一個指向字元的常量指標,p是不允許改變的 另外要注意的是 const char* p等價於 char const *p 也就是說const描述char和*p是等價的

c++物件陣列this指標

當程式需要建立同一個類的多個物件時,可以建立物件陣列,宣告物件陣列的方法和宣告標準型別陣列相同,且陣列用法也相同。 宣告:Stock mystuff[4]; 初試化:Stock stocks[4]= { Stock("WANG",1,2), Stock("zhang",2,

C語言char*字串陣列unsigned char[]陣列的相互轉換

#include <iostream> #include <string> using namespace std; void convertUnCharToStr(char* str, unsigned char* UnChar,

c/c++ 字元陣列、字元指標字串型別

一、字元陣列 定義:用來存放字元資料的陣列是字元陣列,字元陣列中的一個元素存放一個字元。字元陣列具有陣列的共同屬性。 初始化方式: 1 charc[10]={'0','1','2','3','4','5','6','7','8','9'}; 注:當初值個數小於規定長度

C# 位元組陣列字串 互轉

本章講述:部分資料型別,格式轉換(十六進位制字串和位元組陣列 互轉    位元組陣列和字串 互轉)  public class HexConverter { #region 格式轉換 /// <summary> /// 轉換十六進位制

C語言二級陣列二級指標

轉載部落格:https://www.cnblogs.com/zou107/p/4909847.html   一、關於二維陣列和二維陣列區別 (1)一維陣列在記憶體中是連續分佈儲存的,同樣,二維陣列也是在記憶體連續儲存的。所以從記憶體的角度來分析,一維陣列和二維陣列其實沒有本質區

C++中陣列指標之間的關係梳理

C++中陣列和指標是兩個十分常用且關係密切的資料結構,“陣列即指標,指標即陣列”的言論一直層出不窮。從本質上講,陣列和指標是不同的,陣列是具有確定數量的元素,而指標只是一個標量值。但是,在某些情況下陣列和指標又能相互轉換。下面,將從多個角度分析陣列和指標。 1. 陣列和指標互相轉換 陣列

C++及C中的 string char指標char陣列

之所以拋棄char*的字串而選用C++標準程式庫中的string類,是因為他和前者比較起來,不必擔心記憶體是否足夠、字串長度等等,而且作為一個類出現,他整合的操作函式足以完成我們大多數情況下的需要.     下面我們首先從一些示例開始學習下string類的使用. 1) #include <string&

char陣列char指標字串常量的比較

陣列不是基本型別,不能直接參與比較,陣列與字串及字元指標與字串比較其實比較的是二者的地址。 例: int isequiv(char *t) { if (t == "char") return 1; else return 0; } int main() { char te

C#: 字串string位元組陣列byte[]的轉換

string轉byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str ); byte[]轉string: string str = System.Text.Encoding.Default.GetStri

c語言用字元陣列字元指標刪除相同字元

如何用字元陣列和字元指標做引數刪除與某字元相同的字元 1.用字元陣列 char *DelLetter1(char str1[],char a) //用字元陣列刪除 { int i = 0; int c = 0; char *b = (char*)malloc((s

C語言------如何實現字串陣列整形陣列在終端上任意輸

我是新手, 學習C語言過程中,練習程式設計時常會遇到輸入任意字串(不越界的情況下任意輸入),或者是輸入任意長度的整形陣列,下面就是我的一些關於任意字串和陣列輸入程式碼的整理. 1. 字串      

c語言的字元陣列字元指標

   這幾天搞Unix上的C程式,裡面用到了很多字元陣列和字串指標,我記得在學完C語言後相當一段時間裡,對指標這個東西還是模模糊糊,後來工作也沒怎麼用到過C,雖然網上這類的文章也有很多,還是決定自己在這做個小總結,也算加深下自己的印象,寫了下面的測試程式: #inclu

c++ primer plus書之--c++函式, 陣列引數與指標的關係2

陣列怎麼在函式的引數中進行傳遞: // simple function #include "iostream" using namespace std; const int Size = 8; // 函式原型, 可以不寫變數名, 變數名也可以與函式定義的變數名不同 int sum_arr(in

C++ premier plus書之--C++函式, 陣列引數與指標的關係1

C++的實參和形參 double cube(double x); int main()  {     int a = 5;     cube(a); } 這裡a被稱為實參, x被稱為形參, 形參就是用於接收傳遞值的變數,

C++實現陣列連結串列的排序演算法

OK,我們經常會用到排序演算法。那麼,常用的排序演算法,除了使用陣列之外,用連結串列又該如何處理呢?下面我們來做個對比: //使用插入排序對陣列進行排序 int *get_order(int *num, int length) { for(int eiter = 1; eiter <

C語言陣列型函式指標,替代switch case結構

#include <stdio.h> typedef void (*KeyEvent)(void); KeyEvent pKey_Func[100]; void pFunc0(void) { printf(“Hello Kitty\n”); } void pFun

c#字串簡寫全稱比對

需求:涉及到單位名稱之類的字串,會用到簡寫,如果需要和全稱比對,對坐入號 解決方法: var danwei = “財政經濟委員會” char[] dw = danwei.ToCharArray(); //假設簡寫是“財經委” var danweis =