1.char *p1,p2;
c语言中,声明的语法是 基本类型 生成基本类型的东西;
所以上面声明了一个char类指针,而p2声明符只有p2,为普通char型变量。
char *p1, *p2;
2.声明一个指针并为其分配空间。
char *p;
*p = malloc(10);
这里声明的指针是p不是*p。
3.一个全局变量或函数可以多处“声明”,但“定义”却最多只能允许出现一次,对于全局变量,定义是真正分配空间并赋初值的声明。
4.
// 1.cpp int x = 10; // 2.cpp 注意没有包含1.cpp #include <iostream> using namespace std; extern int x; int main () { cout << x << endl; } //则输出10 两个文件同在一个项目(project)中,你不包含某个文件(cpp)而可以用它内部定义的变量,(里是.pp不是.h, 因为在.h中定义的数据不能在.cpp中用除非这个.cpp包含这个.h文件) 例: // 1.h #include <iostream> void print() { std::cout << "hello!" << std::endl; } // 2.cpp #include <iostream> using namespace std; // 以上两句在这个例子中可以不要 extern void print(); int main () { print(); } 就会出错因为1.h中的void print();在不包含它的文件中是不可调用的,即使在声明了extern 也于事无补,如果你将这个例子中的1.h名字换成1.cpp就对了! 从这些可以看出来,extern在这里起的作用是告诉编译器,你这个print()已经在某个.cpp中已经定义了,这里只不过是声明一下有这个东西,然后拿来用一下。定义只能出现一次,声明却可出现多次,也就是说extern声明可在多个文件中用(包括.h) 还有,你还可以屏蔽extern声明,如第二个例子中的第二个.cpp文件可以改成 #include <iostream> using namespace std; // 这里以上两句不能省略,因为,这里extern void print();函数已经不起作用了,在这里调用的而是本文件中定义的void print()函数,其中用到了cout,endl;他们来源于std::<iostream> extern void print(); void print() { cout << "world!" << endl; } int main () { print(); } // 输出结果为world!
5.typedef用来定义新的类型名称,而不是定义新的变量或函数。
一、typedef的用法
在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像:
typedef int INT;
typedef int ARRAY[10];
typedef (int*) pINT;
typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。
二、#define的用法
#define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编
译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题,它的实例像:
#define INT int
#define TRUE 1
#define Add(a,b) ((a)+(b));
宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变
量的功能。请看上面第一大点代码的第三行:
typedef (int*) pINT;
以及下面这行:
#define pINT2 int*
效果相同?实则不同!实践中见差别:pINT a,b;的效果同int *a; int *b;表示定义了两个整型指针变量。而pINT2 a,b;的效果同int *a, b;
表示定义了一个整型指针变量a和整型变量b。
6.
typedef struct {
char* item;
NODEPTR nest;
} *NODEPTR;
不能成功定义一个链表,不能在定义typedef类型之前使用它,在next域声明的地方还没有定义NODEPTR。
修正版本:
(1)
typedef struct node {
char *item;
struct node *next;
} *NODEPTR;
(2)
struct node;
typedef struct node *NODEPTR;
struct node {
char *item;
NODEPTR next;
};
(3)
struct node {
char *item;
struct node *next;
};
typedef struct node *NODEPTR;
7.
typedef int (*func)();
定义了一个类型func,表示指向返回值为int型的函数的指针,它可以用来声明一个或多个函数指针。
func fp1, fp2;
上述等价于: int (*pf1)(), (*pf2)();
char *(*pfpc)(); //pfpc是一个函数的指针,而函数则返回char型的指针。
8.函数只定义了一次,调用了一次,但编译器提示非法重声明了。
答:在作用域内没有声明就调用(可能是第一次调用在函数的定义之前)的函数被认为声明为:extern int f();
即未声明的函数被认为返回int型且参数个数未知。如果之后函数的定义不同,则编译器就会警告类型不符。返回非int型、接受任何窄类型参数或可变参数的函数都必须在调用前声明。
另一个原因是该函数与某个头文件中声明的另一个函数同名。