指针的大小
#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比特宽度的算术与逻辑运算。
…
处理器中的寄存器通常可分为三种:整数、浮点数、其它。在所有常见的主流处理器中,只有整数寄存器才可存放指针值(内存数据的地址)。非整数寄存器不能存放指针来读写内存,因此不能用来避开任何受到整数寄存器大小所影响的内存限制。
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