[英]C char array pointer confusion
我寫了以下 c 代碼:
#include <stdio.h>
#include <stdlib.h>
void func1(char *arr){
printf("%d\n",arr[0]);
printf("%d\n",arr[1]);
return;
}
int main () {
char a[6] = "hello";
printf("%p\n",a);
printf("%p\n",&a);
func1(a);
return 0;
}
當我執行此代碼時,我正在關注 output
0x7fff5a7323e2
0x7fff5a7323e2
104
101
以下是我的疑惑:
arr[1]
的值小於arr[0]
,這些值是什么?1. 為什么
arr[1]
的值小於arr[0]
,這些值是什么?
printf("%d\n",arr[0])
和printf("%d\n",arr[1])
將打印這些位置字符的十進制值,因為您的字符編碼是 ASCII十進制值e
( arr[1]
) 的值為 101,十進制值h
( arr[0]
) 為 104,您可以在鏈接表中查看。
2. 假設給定 0 到 1073741823 是有效的 memory 范圍,我們必須檢查傳遞給 func1 的數組是否在有效范圍內,然后如何檢查。
在這種情況下,因為它是一個字符串,你知道它在數組末尾會有一個標記 null 字節,所以你可以使用:
// initially arr will be pointing to the first element of the array
while(*arr != '\0'){ // will evaluate to false when the string ends
//do stuff...
arr++;
}
還有其他方法可以做到這一點,例如,將數組的大小作為第二個參數傳遞:
void func1(char *arr, int size){...}
和電話:
func1(a, sizeof a / sizeof *a);
當您的數組不是null 終止數組時,這更有用,否則您始終可以使用哨兵來指示 arrays 的結尾,缺點是在大多數情況下您需要自己添加它們。
請注意, printf("%p\n", a)
的行為未定義,您應該有printf("%p\n", (void*)a)
。
您需要了解printf
的格式化字符串。 printf("%d\n",arr[0]);
期望打印一個integer到output。但是在C中,字符可以根據其在memory中的編碼值處理為integer。例如,104根據ASCII編碼表示“h”。 而101代表“e”。 為您的陣列分配的 memory 由系統管理,您不應該檢查它們是否在有效范圍內。 但您始終可以將它們視為 integer 並使用簡單的比較運算符。
對於第二部分,您可以將十六進制地址轉換為十進制,並將其與提供的范圍進行比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.