C++学习笔记一

1.关于C与C++的编译器

对于函数void fun(int x,int y);

这个函数,经过C语言的编译器之后,在编译器中的名字是_fun,而经过C++编译之后,该函数在编译器中的名字是_fun_int_int,这样就支持了函数的重载和函数类型安全链接。但C++调用C的编译库函数也就出现了问题,C++中提供extern "C"来解决这个问题。e.g.

extern "C"

{

void fun(int x,int y);

}

当然也可以写成下面的形式:

extern "C"

{

#include "myheader.h"    //包含C语言库函数的头文件

}

这样,当C++调用这个C编译库中的函数时,就会在C++编译库中寻找_fun的函数,而不是在C++中寻找_fun_int_int的函数了。

当然大多数C++的开发上已经在编译器中做了extern的操作,所以我们可以直接使用#include包含相关的头文件。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

2.指针

数据存储在存储器中,一般把存储器中的一个字节成为一个内存单元;内存单元的指针和内存单元的内容是不一样的,指针只能赋予存储的地址,不允许把一个数赋给指针变量。指针变量的类型说明了该指针指向的变量的数据类型。通过地址运算符&给指针赋值。e.g.

int a= 5,*pa = &a; //将a的存储地址赋给指针变量pa

或者:

int a=5,*pa;

pa = &a; //将a的存储地址赋给指针变量pa

printf("%d", *pa);

结果:

5

【注意】

1.pa为指针的值(即该指针指向的int变量的存储地址),*pa为该指针指向的int变量的值;

2.在指针声明的时候给指针赋值:int *pa = &a; 而在指针被声明之后给指针赋值:pa = &a;

---------------------------------------------------------------------------------------------------------------------

除此之外,

int a= 5,b=3;

int *pa=&a,*pb=pa,*pc;

pc=pa;

--------------------------------(1)

int a[5], *pa;

pa = a; //将指针pa指向一个整形数组a,这个过程是将数组的首地址装入指针变量中,也可以写成pa=&a[0]

或者:

int a[5], *pa=a;

-------------------------------(2)

char arr[30]= "C++ language!", *parr;

parr = arr; //将字符数组赋给指针的过程是将字符数组的首地址(即第一个元素的地址)赋给指针,在C++中数组的存储地址是连续的

或者:

char *parr;

parr = "C++ language!"; //arr为字符数组,一个字符数组可以认为就是一个字符串

-------------------------------(3)

int (*pf)(); //声明了一个指向函数的指针

pf = f; //f为返回int值的函数,即有int f(){ 函数体 }

-------------------------------(4)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

int a[5]={0,1,2,3,4}, *pa = a;

printf("*pa=%d", *pa);

printf("*(pa+2)=%d", *(pa+2));

结果:

*pa=0

*(pa+2)=2

--------------------------------------------------------------------------------

int *p;

p = 0; //此时指针p为空指针

【注意】指针不赋值可指向任意变量,不可使用!


函数指针:

函数fun()为返回int值得函数,它的指针是:int (*pf)();

e.g.

#include "stdio.h"

int max(int a, int b)

{

if(a>b) return a;

else return b;

}


void main()

{

int (*pf)(int, int);

pf = max;

int x = 10, y = 12, z_max;

z_max = pf(x, y);

printf("z_max=%d", z_max);

}

---------------------------------------------------------------------------

二维数组的指针:

对于二维数组a[4][5];

a 表示第0行首地址;

a+1 表示第1行首地址;

a+i 表示第i行的首地址。

e.g.

int *p, a[10][20], *pa;

p = a;  //将二维数组的第0行的首地址赋给指针变量p

pa = p +i; //将二维数组中第i行的首地址赋给指针变量pa

-----------------------------------------------------------------------------

多级指针:

指向指针的指针变量,int **p;

e.g.

#include "stdio.h"

int main()

{

int a = 5, *p, **pp;

p = &a;

pp = &p;

printf("a=*p=%d", *p);

printf("a= **pp");

}

-------------------------------------------------------------------------------

分配内存的函数:

char *pc;

pc = (char *)malloc(100);//分配100个字节大小的内存空间,首地址赋给指针

释放内存空间的函数:

free(void *ptr);

其中ptr为任意类型的指针变量,指向被释放区域的首地址,被释放区域应为malloc和calloc分配的区域。

-------------------------------------------------------------------------------2014.10.29


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值