做了几年的C/C++,回头看看,编程最重要的还是基本概念。上午同事让我看一个程序,下面是源码:
int main(int argc, char* argv[])
{
char* str1 = "123";
char* str2 = "123";
const char* str3 = "123";
const char* str4 = "123";
char str5[] = "abc";
char str6[] = "abc";
if(str1 == str2)
{
printf("1\n");
}
if(str3 == str4)
{
printf("2\n");
}
if(str5 == str6)
{
printf("3\n");
}
if(!strcmp(str5,str6))
{
printf("4\n");
}
return 0;
}
其实这里考察的是指针和数组的区别。指针和数组在传参时没什么区别,指针的效率更高。其它时候个数组名可作为指针常量,不能修改。在这个例子中,char str5[] = "abc"意味者给数组str5在栈中分配分配一块内存空间,存储的是字符串“abc”;str5也是同样的意思。它们是两个数组,只不过放的值一样而已。上面的代码C和C++下执行结构是一样的,但是有些细节是不一样的.指针不是数组,数组也不是指针。值得注意的是strcmp函数,形参是const char *,数组名刚好就是一个const char *;但是这个函数也可以用于普通的指针,参数传参实际上是个赋值过程。
数组的创建不是在栈区就是在全局区,指针就是内存的别名。指针的长度是固定的,数组则不一定。sizeof操作符在数组和指针中的值是不一样的。工作后,在回头理解那些基本的概念,感觉不一样的。
附注:指向数组指针,本质还是个二维指针,不过一维的维数是固定的。
char (*p)[82];-----------------------------声明一个指向数组的指针p,这个指针的步长是一个82个长度的字符数组
p=(char(*)[82])(5*82);-------------------给指针p分配内存
memcpy(*p,"abcd")-----------------------给指针赋值,不能用*p=“abcd”;这里就可以看出数组和指针、字符串的区别