您的位置:首页 > 其它

c问题

2015-06-30 10:15 309 查看
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型、接受任何窄类型参数或可变参数的函数都必须在调用前声明。

另一个原因是该函数与某个头文件中声明的另一个函数同名。

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: