C语言字符串

指针的大小

#include <stdio.h>

typedef char* PCHAR;
PCHAR a;

int main() {
	a = "hello, world";
	printf("size of int = %d\n", sizeof(a));
	return 0;
}

// output: size of int = 8

因为我的机器的64位的,所以存放地址的长度也是64,为8个字节。

64位CPU是指CPU内部的通用寄存器的宽度为64比特,支持整数的64比特宽度的算术与逻辑运算。

处理器中的寄存器通常可分为三种:整数、浮点数、其它。在所有常见的主流处理器中,只有整数寄存器才可存放指针值(内存数据的地址)。非整数寄存器不能存放指针来读写内存,因此不能用来避开任何受到整数寄存器大小所影响的内存限制。

维基百科-64位:https://zh.wikipedia.org/wiki/64%E4%BD%8D%E5%85%83

char []和char *

char a[10] = “hello”; 变量a代表的是一个拥有10元素的数组的首地址。

但是为什么可以使用printf(“%s\n”, a); 打印出整个字符串呢?

C语言中操作字符串是通过它在内存中的存储单元的首地址进行的,参考

如果通过printf(“%p\n”, a); 打印出a存储的地址,0x7ffc9d1b30b0,如果使用printf(“%s\n”, 0x7ffc9d1b30b0);也是可以打印出整个字符串的。

这也就是为什么可以使用char *b = “hello”; 的原因,b中存放的是”hello”字符串常量第一个字符的地址,同上,也就可以使用printf(“%s\n”, b); 打印字符串。

还有一点,char []的字符串是存储在全局数据区或者栈区的,而char *的字符串是存储在常量区的,因此全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。

sizeof 和 strlen

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0′)。百度百科-strlen

// Defined in header <string.h>
// size_t strlen(const char *str);
char a[10] = "hello";
size_t length = strlen(a); 
// size_t is the unsigned integer type of the result of sizeof , alignof (since C11) and offsetof.

strlen大概可以这样理解:获取字符串数组中元素的个数。

返回的类型是size_t在32位的机器上是4位,在64位的机器上8位。

sizeof C语言中判断数据类型或者表达式长度符;不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来。百度百科-sizeof

参考-cppreference-sizeof:http://zh.cppreference.com/w/c/language/sizeof

参考-cppreference-size_t:http://en.cppreference.com/w/c/types/size_t

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部