strcpy和memcpy都是标准C库函数,它们有下面的特点。
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。
已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);
memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。
void *memcpy( void *dest, const void *src, size_tcount);
strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
sizeofC/C++中的一个操作符(operator),其作用就是返回一个对象或者类型所占的内存字节数。
其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一般定义为 typedef unsigned int size_t;
编译器不同,size_t长度不同。但作为一个规范,它们都会保证char、signed char和unsigned ;char的sizeof值为1,
sizeof有三种语法形式,如下:
1) sizeof( object ); // sizeof( 对象 );
2) sizeof( type_name ); // sizeof( 类型 );
3) sizeof object; // sizeof 对象;
-------------------------------------我是分割线----------------------------------------
sizeof( 2 + 3.14 )=8; // 3.14的类型为double,2也会被提升成double类型,所以等价于 sizeof( double )=8;
C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,
sizeof的计算发生在编译时刻,所以它可以被当作常量表达式使用。
最新的C99标准规定sizeof也可以在运行时刻进行计算,如:
int n;
n = 10; // n动态赋值
char ary[n]; // C99也支持数组的动态定义
printf("%d\n", sizeof(ary)); // ok. 输出10
但在没有完全实现C99标准的编译器中就行不通了,上面的代码在VC6中就通不过编译。
指针记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。
数组的sizeof
数组的sizeof值等于数组所占用的内存字节数,如:
char a1[] = "abc"; -------------------------作为常量,存储在静态存储区。
int a2[3];
sizeof( a1 ); // 结果为4,字符末尾还存在一个NULL终止符
sizeof( a2 ); // 结果为3*4=12(依赖于int)
-------------------我是分割线---------------------------
默认类型:
一个常数如果其范围允许,那么计算机默认将其认为是 int 类型的;
常量定义加3LL----------long long 类型, 常量定义加3ULL----------unsigned long long
实型常数一般只用10进制表示。比如 123.45,或 .123。后者是 0.123的简写。C++按double类型为这个数分配内存,也就是说为它分配8个字节。
常量定义加 f 或 F,指定为float类型。
常量定义加 l 或 L, 指定为double类型。
实型数还可以使用科学计数法,或曰指数形式,如:123e4、或123E4
内存分配方式
内存分配有三种:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。