工具毕竟只是辅助,往往在为我们提供方便的同时丢掉了原有的灵活;作为一个程序员,我们有权利和义务了解从源代码到执行程序过程中,编译器为我们做了什么,只有深入了解计算机系统,才能写出高效的代码。所以从学习技术的角度看,我们不要太过于依赖IDE;当然从商业开发的角度看,IDE能大大提高我们的开发效率。即使是VS的开发者,他们在开发的过程中也不会使用什么IDE。。
@ww
类型应该是指:在使用前有明确定义的类型,包括C++内置类型,标准库类型,用户自定义类型。

int* x,y; //对象(变量)x,y是指针类型(int *)
int array[100]; //int[100]是编译器为了方便而显示的“伪”类型,当数组名被使用时,编译器给他转换成适当的类型。
*array=0; //数组名隐式转换成指针类型(int*)
*(array+1)=sizeof(array); //后一个数组名不再转换成指针类型,array[1]=400

typedef int[100] array; //error,int[100] not a typename
typedef int array[100]; //ok
array arr;
所以个人比较倾向于数组名(而不是int[100])隐式转换成指针类型(int*),在很多时候数组名跟指针是等价的。
int array[100]; //当然为了理解方便,去掉变量名int[100]可以看作是array的类型。在char *strncpy(char *,const char *,size_t)中,可以把函数名strncpy的类型看作是char* (char *,const char *,size_t),事实上,编译器在报错时就是这样显示的。注意char* (char *,const char *,size_t)是函数返回char*指针,和char (*)(char *,const char *,size_t)指向函数的指针,该函数返回char 不一样。
1 int array[100];
2
3 memset(array, 0, sizeof(array));
4 memset(&array, 0, sizeof(array));

第3行和第4行其实是一样的,只是不同的写法而已。array OR &array,编译器取的都是数组首地址(即数组名隐式转换成pointer类型)。而不能说array 和 &array是两种不能的类型,数组名本来就不是一种类型。

下面一个相似的例子:
#include <cstdio>

void func(char* str)
{
puts(str);
}

int main(void)
{
func("Normal called..");
(*********************************func)("No ploblem called by this way.");//typeof(func)?
(*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&func)("No ploblem, Just a joke.");//typeof(func)?
return 0;
}

=================================================
D:\workspace\test>g++ test0b.cc -o test0b.exe

D:\workspace\test>test0b
Normal called..
No ploblem called by this way.
No ploblem, Just a joke.

个人意见,高手勿笑。

posts - 0, comments - 0, trackbacks - 0, articles - 0

Copyright © Xshl5