C語言中0、‘\0‘、‘0‘、NULL以及類型轉化
0 ‘\0′ ‘0′ NULL
0 ‘\0’ NULL都是三種0值,它們在數字上是完全一樣的,而且在內存中存的都是二進制0。
所以,它們的值是一樣的,隻不過表現的形式不一樣,也就是它們的類型是不同的:
0在整形中表示數字0,在字符中’0’表示一個字符它的ASCII碼值為48,
‘\0’是一個字符,表示字符串結束,在ASCII中的值為0
NULL 即空指針,它表示一個指針指向地址為0的空間,可以看到這裡的0被強制轉化為void*指針,這也就意味著而NULL可以賦值給任何類型的指針:
對於不同的類型,如果使用運算符(比如±=等運算符)運算的話,會進行隱式類型轉化,對於一些類型檢查嚴格的編譯器可能會報錯:
#include<stdio.h> int main() { int a = '\0';//將'\0'的ASCII碼值賦值給a char b = 0;//將0的二進制賦值給b int c = '0';//將字符'0'的ASCII碼值賦值給c int d = a + b + c;//在相加時,由於b是char型,所以會整形提升為int型 printf("%d\n", d);//以%d形式打印d內存空間的內容 printf("%c\n", '0');//打印字符'0' printf("%d\n", '0');//打印字符'0'的ASCII碼值 printf("%c\n", 0); //空(即NULL) printf("%d\n", 0);//數字0 printf("%c\n", 0 + '\0');//空(NULL) '\0'先轉換成int,然後ASCII編碼相加為0, //%c輸出,轉換成char,所以輸出NULL printf("%d\n", 0 + '\0');//先轉換成int,然後ASCII編碼相加為0,%d輸出,不用轉換,輸出數字0 printf("%c\n", 0 + '0');//'0'先轉換成int,然後ASCII編碼相加為0, //%c輸出,ASCII轉換成char,所以輸出字符'0' printf("%d\n", 0 + '0');//輸出字符'0'的ASCII碼值 }
真實的類型轉化和不改變內存的類型轉化
真實的類型轉化:改變內存中的數據
不改變內存的類型轉化:不改變內存中的數據,隻改變對應的類型
舉個例子:比如把字符串”12345″轉化成整形數字12345,它們的內存大小和內容都發生瞭改變,字符串”12345″的內存大小為6字節,每個字節存儲的是單個字符的ASCII碼值,而整形數字12345則為4字節,內存中存儲的是數字12345的二進制補碼。
如果要實現這種轉化,則要使用對於的函數,在這裡可以自己實現一個:
#include<stdio.h> int my_atoi(char* str) { int i = 0; int flag = 1;//默認字符串為正 int value = 0; if ('-' == str[0]) { flag = -1;//字符串第一個字符為‘-',則將flag置為-1 i++; } else if ('+' == str[0])//字符串第一個字符為'+',則不改變flag { i++; } else//字符串不加符號,默認為正 { ; } while (str[i] >= '0' && str[i] <= '9') { value = value * 10 + str[i] - '0'; i++; } return flag * value; } int main(void) { char str1[] = "+12345"; char str2[] = "-12345"; char str3[] = "12345"; int a = my_atoi(str1); int b = my_atoi(str2); int c = my_atoi(str3); printf("%d\n", a); printf("%d\n", b); printf("%d\n", c); return 0; }
而對於不改變內存的類型轉化,則不會改變其內存空間中存儲的值,隻是改變數據類型:
對於C語言強制類型轉換時,會有兩種方式:
- 保持內存中的內容不變,僅修改對這段內存的解釋方式, 如int和char的互轉
- 保持值不變(近似),但修改內存中的內容,如int和double的互轉
附:c語言中不同數據類型之間的相互轉化
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> void split(char* str, double* position) { char* words[3]; char* temp; temp = strtok(str, " "); int i = 0; while(temp!=NULL) { words[i] = temp; temp = strtok(NULL, " "); position[i] = atof(words[i]); i++; } } int main() { char lineBuf[] = "11.12 11.13 11.14"; std::cout << "1" << std::endl; double position[3]; split(lineBuf, position); std::cout << "1" << std::endl; for(int i=0; i<3; i++) { // std::cout << words[i] << std::endl; // position[i] = atof(words[i]); std::cout << position[i] << std::endl; } return 0; }
總結
到此這篇關於C語言中0、‘\0‘、‘0‘、NULL以及類型轉化的文章就介紹到這瞭,更多相關C語言0、\0、0、NULL及類型轉化內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!