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語言強制類型轉換時,會有兩種方式:

  1. 保持內存中的內容不變,僅修改對這段內存的解釋方式, 如int和char的互轉
  2. 保持值不變(近似),但修改內存中的內容,如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!

推薦閱讀: