编程语言C/C++(一)

编程语言C/C++的一些基本概念(一)

(1)简述变量声明和定义的区别。

为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但是只在一个地方定义。加入extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义

(2)正确认识sizeof:**

在32位机器中,如下代码:答案为4,23

void example(char acWelcome[]){
  printf("%d",sizeof(acWelcome));
  return;
}
void main(){
  char acWelcome[]="Welcome to Huawei Test";
example(acWelcome);
printf("\n%d\n", sizeof(acWelcome));
return;
}

sizeof括号里面的内容在编译过程中是不被编译的,而是被替代类型。

sizeof的使用场合:
1)sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信;
2)用它可以看看某种类型的对象在内存中所占的单元字节,便于一些类型的扩充;
3)由于操作数的字节数在实现时可能出现变化,建议在涉及操作字节大小时用sizeof代替常量计算。

(3)关于类的占用空间:

在类中,如果什么都没有,则类占用1个字节,一旦类中有其他的占用空间成员,则这1个字节就不在计算之内,如一个类只有一个int则占用4字节而不是5字节;

如果只有成员函数,则还是只占用1个字节,因为类函数不占用空间

虚函数因为存在一个虚函数表,需要4个字节(只算一次),数据成员对象如果为指针则为4字节,注意有字节对齐,如果为13字节,则进位到16字节空间;

sizeof的本质是得到某个类型的大小,确切的来说就是当创建这个类型的一个对象(或变量)的时候,需要为它分配的空间的大小。而类也可以理解为类似于int、float这样的一种类型,当类中出现static成员变量的时候,static成员变量是存储在静态区当中的,它是一个共享的量,因此,在为这个类创建一个实例对象的时候,是无需再为static成员变量分配空间的,所以,这个类的实例对象所需要分配的空间是要排除static成员变量的,于是,当sizeof计算类的大小的时候会忽略static成员变量的大小

(4)二叉树的遍历:

先序:根左右
中序:左根右
后序:左右根

若要先序和中序序列一致,那么二叉树满足没左子树就好了

(5)关于printf函数和scanf函数

printf("%x,%o,",ch,ch,k);//将ch以16进制输出为61,八进制为141,k参数被忽略。
printf(“k=%%d\n”,k); // %是控制符,用 %% 表示输出一个百分号
C语言 若有说明:int *p,m=5,n;以下正确的程序段是()
A、scanf("%d",&n);p=n;
错在
p = n, 因为p指向的空间为NULL,直接赋值n,会出错
B、p=&n;scanf("%d",*p);
错在scanf,因为是使用的是地址,应该是scanf("%d",p);
C、p=&n;scanf("%d",&p);
同上,应该是scanf("%d",p);
D、p=&n;scanf("%d",p);
可以看看scanf的使用方法,就知道这个是对的。
前面p = &n, 就是说指针指向了变量n,p就是变量n的地址。

(6)线索二叉树定义:

通过考察各种二叉链表,不管二叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n各结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个。因此,提出了一种方法,利用原来的空链域存放指针,指向树中其他结点。这种指针称为线索。

二叉树的遍历本质上是将一个复杂的非线性结构转换为线性结构,使每个结点都有了唯一前驱和后继(第一个结点无前驱,最后一个结点无后继)。对于二叉树的一个结点,查找其左右子女是方便的,其前驱后继只有在遍历中得到。为了容易找到前驱和后继,有两种方法。一是在结点结构中增加向前和向后的指针fwd和bkd,这种方法增加了存储开销,不可取;二是利用二叉树的空链指针。

现将二叉树的结点结构重新定义如下:
lchildltagdatartagrchild
其中:ltag=0 时lchild指向左子女;
ltag=1 时lchild指向前驱;
rtag=0 时rchild指向右子女;
rtag=1 时rchild指向后继;
编程语言C/C++(一)
检索二叉树增加了指向其前驱结点和后继结点的指针,无需借助于堆栈,
使用二叉链表存储的二叉树可使用中序遍历,中序遍历的非递归实现用栈完成

(7)malloc和new的区别?

1)malloc和free是标准库函数,支持覆盖;new和delete是运算符,并且支持重载。
2)malloc仅仅分配内存空间,free仅仅回收空间,不具备调用构造函数和析构函数功能,用malloc分配空间存储类的对象存在风险;new和delete除了分配回收功能外,还会调用构造函数和析构函数。
3)malloc和free返回的是void类型指针(必须进行类型转换),new和delete返回的是具体类型指针。

(8)指针和引用区别?

1)引用只是别名,不占用具体存储空间,只有声明没有定义;指针是具体变量,需要占用存储空间。
2) 引用在声明时必须初始化为另一变量,一旦出现必须为typename refname &varname形式;指针声明和定义可以分开,可以先只声明指针变量而不初始化,等用到时再指向具体变量。
3)引用一旦初始化之后就不可以再改变(变量可以被引用为多次,但引用只能作为一个变量引用);指针变量可以重新指向别的变量。
4)不存在指向空值的引用,必须有具体实体;但是存在指向空值的指针。