从string.size()和string.length()聊到长度的问题和一个关于数据结构定义的技巧

最近工作中要查看一下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 unsigned short UINT16  //16位无符号整数

#define unsigned int UINT32 //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

几乎所有的优秀软件设计文档都是这么定义数据结构的.!!!!!

时间: 2024-10-13 00:18:19

从string.size()和string.length()聊到长度的问题和一个关于数据结构定义的技巧的相关文章

String构造器中originalValue.length&gt;size 发生的情况

建立map的方式(其实用的是json实现方式) var a = {}; a["key1"] = "value1"; a["key2"] = "value2"; 既然是个map就有检索某个键是否存在的方法,这样写 if ("key1" in a) { // something } else { // something else } 简单的一句话声明map里面的key和value的方式: var a = {'

c++ string的size()函数和length()函数

C++标准库中的string中两者的源代码如下: size_type   __CLR_OR_THIS_CALL   length()   const { //   return   length   of   sequence return   (_Mysize); } size_type   __CLR_OR_THIS_CALL   size()   const { //   return   length   of   sequence return   (_Mysize); } 所以两者没

判断字符串是否为空--string.Empty、string=&quot;&quot;、s.length==0

Console.WriteLine("".Equals(string.Empty));//结果:true String.Empty和string=””是一样的,同样都是需要占用内存空间<空字符串>:但优先推荐使用string.Empty 还一种高效判断方法(s.length==0)来判断字符串是否为空字符串: [注意]:null string str=null则是表示str未指向任何对象.

string.size()和size_type

写一道小题目时发现了一个隐蔽错误,之前也没有在意过.就是string.size()返回的是size_type类型,而size_type等同于unsigned int 那道小题目如下: 当时写的代码如下: 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 int main() 6 { 7 int N; 8 string name; 9 int maxsize = -1; 10 string max

String str=new String(&quot;abc&quot;)到底创建了几个对象

这句代码到底创建了几个对象?研究了好一阵,现在才能说清楚. package com.sun.test; public class Test<T> { T a; /** * @param args */ public static void main(String[] args) { String str=new String("abc"); } } 我们来看下这段简单代码的字节码: <pre name="code" class="java

unicode string和ansi string的转换函数及获取程序运行路径的代码

#pragma once#include <string> namespace stds { class tool { public: std::string ws2s(const std::wstring& ws) { std::string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C"; setlocale(LC_ALL, "chs"); const wchar_t* _Sou

由String str=new String(&quot;abc&quot;);引起的

话题是由如下的事情引出的: public class StringTest { public static void main(String[] args) { String str1 = new String("abc"); String str2 = "abc"; if (str1 == str2) { System.out.println("str1 == str2"); } else { System.out.println("

android 将图片通过base64转换为String 将图片String转换为Bitmap

1.Bitmap转换为图片字符串 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); //该方法用来压缩图片,第一个参数为图片格式,第二个参数为截取图片的保留率,如当前为90,则保留之前图片90%的区域 bitmap.compress(Bitmap

关于String类和String[]数组的获取长度方法细节

一.在Java中,以下代码段有错误的是第(  )行 public static void main(String[] args) { String name = "小新";                       //第一行 String sex = new String("男");          //第二行 String age = 18+"";                       //第三行 int len = name.le