1.
如何 动态创建 一个 char*数组(即数组的元素是char*类型)
解决方法:
char **strArray = new char*[10];<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
*strArray=new char[10];
这样 就可以
strArray[0]="ansgag"; strArray[1]="adg";
等给字符串数组元素赋值了。
动态创建二维数组:
int **test = new int*[10];
*test = new int[10];
表示创建一个10*10的二维数组。
2.函数的返回类型 不能 是 函数名 或者 数组 !
3.内存初始化函数memset()(该部分转载至互联网,非原创。感谢原作者)
作用:在一段内存中填充某个给定的值,注意填充时是按照字节顺序填充的,而不是按照元素填充。此方法是对较大的结构体和数组进行清零操作的一种有效方法。
函数形式:memset(void *buffer,int c,size_t n)
buffer是需要设置的内存的开始地址;c是期望填充值;n是需要填充的字节数。
作用:在一段内存中填充某个给定的值,注意填充时是按照字节顺序填充的,而不是按照元素填充。此方法是对较大的结构体和数组进行清零操作的一种有效方法。
函数形式:memset(void *buffer,int c,size_t n)
buffer是需要设置的内存的开始地址;c是期望填充值;n是需要填充的字节数。
1)Memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为' '或'\0';
例:char a[100];
memset(a, '\0', sizeof(a));
2)memset可以方便地清空一个结构体类型的变量或数组。
如:
struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};
对于变量
struct sample_strcut stTest;
用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));
如果是数组:
struct sample_struct TEST[10];
则
memset(TEST,0,sizeof(struct sample_struct)*10);
例:char a[100];
memset(a, '\0', sizeof(a));
2)memset可以方便地清空一个结构体类型的变量或数组。
如:
struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};
对于变量
struct sample_strcut stTest;
用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));
如果是数组:
struct sample_struct TEST[10];
则
memset(TEST,0,sizeof(struct sample_struct)*10);
注意:使用memset时要注意的是,memset是逐字节进行填充,所以s一般为char *型。对于其它类型的s,可以填充的值有两个,0和-1。这是因为计算机中用二进制补码表示数字,0和二进制补码为全0,-1的二进制补码为全1。如果要 初始化为其它的值,可以用一个for循环,如:for(int i=0;i<n;i++)s[i]=v;
如果类包含虚拟函数,则不能用 memset 来初始化类对象。因为每个包含虚函数的类对象都有一个指针指向虚函数表(vtbl)。这个指针被用于解决运行时以及动态类型强制转换时虚函数的调用问题。该 指针是被隐藏的,对程序员来说,这个指针也是不可存取的。当进行memset操作时,这个指针的值也要被overwrite,这样一来,只要一调用虚函 数,程序便崩溃。这在很多由C转向C++的程序员来说,很容易犯这个错误,而且这个错误很难查。为了避免这种情况,记住对于有虚拟函数的类对象,决不能使用 memset 来进行初始化操作。而是要用缺省的构造函数或其它的 init 例程来初始化成员变量。
(PS:经测试,如果不是0或-1的话,里面初始化的值将是一个随机无穷大或者无穷小的值,跟未初始化的效果是一样的。)
void *memcpy(void *dest, void *src, unsigned int count);
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
memcpy 用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
memcpy 用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度。
例:char a[100],b[50]; memcpy(b, a, sizeof(b));
注意如果用memcpy(b,a,sizeof(a)),很可能会造成b的内存地址溢出。
函数形式:char *strcpy(char *dest,char *src);
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
Strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝。
例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。
strncpy(a,b,n)
strcpy函数源码:
char *strcpy(char *strDest, const char *strSrc);
{
assert((strDest!=NULL) && (strSrc !=NULL));
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ )
NULL ;
return address ;
}
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
Strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝。
例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。
strncpy(a,b,n)
strcpy函数源码:
char *strcpy(char *strDest, const char *strSrc);
{
assert((strDest!=NULL) && (strSrc !=NULL));
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ )
NULL ;
return address ;
}
4.const
const int *p
可以修改p这个指针所指向的内存地址却不能修改指向对象的值。(这句从右向座读作)
即 p = &a ,是可以的,而*p = 5 在程序中,这样的操作是错误的。
const int *const p;
不可以修改p所指向对象的内存地址也不能利用指针的解引用方式修改对象的值。
int *const p:不可以修改p所指向对象的内存地址能修改指向对象的值.*p = 5是可以的。
转载于:https://blog.51cto.com/pingpeace/204515