最近工作中要查看一下string的長度,然后忘了是哪個函數,所以去網上搜了一搜,決定把網上學的和其他的一些有關長度的東西在這里匯總一下, 然后就有了此帖.
string 是從c語言的char數組的概念發展出來的.但是char指針變量仍然和string的變量不是一個東西,雖然他們都可能是跟字符串打交道. 看下面的例子:
char a[4] = "ab";
char c[] = "ab";
string b = "ab"; -----> b[0] = 'a'; b[1] = 'b'; b[b.size()-1] = 'b'
在string中b.length()和 b.size()沒什么區別,就是指去掉'\0'后的字符串的長度 b.length()=2 b.size()=2
現在我們再來看看sizeof(a) 和 strlen(a)的區別 sizeof(a) = 4 sizeof(c) = 3 strlen(a)=2 strlen(c) = 2.
sizeof求的是真正的內存分配的長度, strlen求的是字符串的長度(注意字符串長度不包括'\0')
int* a; 32位機器上面 sizeof(a) = 4 在64位機器上sizeof(a) = 8 [因為指針就是一個地址,這個地址必須能覆蓋機器的所有選址空間 所有32位機器= 4 * 8 而64位機器= 8 * 8 所以指針大小會有變化]
指針長度好確定,但是int,short,long,char等長度的確定就比較麻煩了下面一段的學習來源 http://blog.sina.com.cn/s/blog_865e6dd50102vmqr.html
int值,short值,char值等的長度規則
1. c/c++規定int字長和機器字長相同
2. 操作系統字長和機器字長未必相同 (機器字長即cpu的字長,指的是其一條指令/一次運算 可以處理的最大寬度)
3.編譯器根據操作系統字長來定義int字長
所以在無os的嵌入式計算機系統上 int的長度和處理器字長一致; 有操作系統的時候,編譯器會根據操作系統的字長來定義int字長: 假如windows64上面運行Dos16,那么所以for dos16的c/c++編譯器中int都是16位的,
簡單的說是編譯器覺得了int的長度是多少
對於整型的數值范圍,每一個編譯器里面都有一個標准頭文件:limits.h,這個頭文件中定義了一些該編譯器所使用的所有數據類型的范圍的宏.例如
#include<limits.h>
int的最大值 INT_MAX 最小值 INT_MIN unsigned int 的最大值 UINT_MAX
在數據結構的設計中,優秀的程序員並不會定義下面的數據結構(假設為win32平台)
typedef struct tagTypeExample
{
unsigned short x;
unsigned int y;
} TypeExample;
他們會像下面那樣定義:
#define UINT16 unsigned short //16位無符號整數
#define UINT32 unsigned int //32位無符號整數
typedef struct tagTypeExample
{
UINT16 x;
UINT32 y;
}TypeExample;
因為這樣定義的數據結構非常具有通用性,如果上述32平台上的數據要發送給16位平台,在16位平台上僅僅需要修改UINT16, UINT32的定義,就可以接收並存儲32位平台的數據了.
#define unsigned int UINT16 //16位無符號整數 ---->對應32位平台的short
#define unsigned long UINT32 //32位無符號整數 ----->對應32位平台的int
幾乎所有的優秀軟件設計文檔都是這么定義數據結構的.!!!!!