C/C++

c语言中字符串变量是用一维数组名来表示的。
数组名实际代表数组的首地址,所以字符串变量实际上是一个字符指针,它指向一个以'\0'结尾的字符串首字符。


结构体与指针配合可以形成链表。
[url=http://blog.csdn.net/krens/archive/2008/07/14/2646839.aspx]形成链表[/url]
2、指针作为参数

void exchange(int *b,int *c)
{int *a;a=b;b=c;c=a}
/*上面这个你交换了b和c的地址,这个时候你获得了你想要得结果,可惜当函数返回后,这一切恢复原样,还是没有交换. */

void exchange(int *b,int *c)
{int a;a=*b;*b=*c;*c=a}
/*上面你交换了指针所指向的值,即便返回,这个交换仍然存在. */

/*为什么呢?void exchange(int *b,int *c),传入的是指针,指针入栈,第一个程序交换它们的地址,函数返回后,也就是指针出栈,地址没有交换.什么也没变. */

/*第二个程序,同样传入的是指针,指针入栈,不过你交换的是指针所指向的值,这个值可没有入栈,这样即便函数返回,指针出栈,值还是被交换了. */


3、形参、实参

int f(int b){/*b为形参*/
return b;
}
main(){
int a=1;
printf("%d",f(a));/*a为实参*/
}


形参:全称为"形式参数"是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传的参数.
实参:全称为"实际参数"是在调用时传递个该函数的参数.

形参和实参的类型必须要一致,或者要符合隐含转换规则, 当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放, 而实参内容不会改变.

而如果函数的参数是指针类型变量,在调用该函数的过程中,传个函数的是实参的地址,在函数体内部使用的也是实参的地址,即使用的就是实参本身.所以在函数体内部可以改变实参的值.

4、函数参数传递方式(传值、传地址、传引用)
[quote]传值
是把实参的值赋值给形参那么对形参的修改,不会影响实参的值

传地址
是传值的一种特殊方式,只是他传递的是地址,不是普通的如int那么传地址以后,实参和形参都指向同一个对象

传引用
真正的以地址的方式传递参数传递以后,形参和实参都是同一个对象,只是他们名字不同而已对形参的修改将影响实参的值
[/quote]
#include <stdio.h>

/**
* 传值
*/
void change1(int x){
x=1; /*将值改成1*/
}
/**
* 传地址
*/
void change2(int *x){
*x=1; /*将指针指向的值变成1*/
}
int main(void){
int a=0;
change1(a);
printf("%d \n",a);
change2(&a);
printf("%d \n",a);
getch();
return 0;
}

5、typedef /*类型定义 type define*/
定义一种类型

#include <iostream.h>

typedef int INTE; /*第一种用法*/
typedef struct _TT /*第二种用法*/
{
int a;
double b;
}TT;
void main()
{
int i;
INTE j=9;/*等同与 int j;*/
i=j;/*不会警告,因为类型同*/
struct _TT st;/*与 TT st的作用一样*/
st.a=1;
st.b=1.0;
cout<<i<<j<<st.a<<st.b;
}

6、枚举与结构体
[quote]enum和struct的唯一区别是:前者是常量的聚集,后者是变量的聚集;
enum COLOR{
RED,
GREEN,
BLUE
};
struct COLOR{
DWORD r;
DWORD g;
DWORD b;
}; [/quote]

7、[url=http://baike.baidu.com/view/1604730.htm]函数与函数指针[/url]
声明:
int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 变量f */
f=func; /* 将func函数的首地址赋给指针变量f */

例子:
int func(int a,int b){
return a+b;
}
int main(void){
int a=3,b=4,c,d;
int (*f)(int,int); /*声明函数指针变量f*/
f=func; /*将函数首地址赋给函数指针变量f*/
c=func(a,b); /*常规的函数调用的写法*/
d=(*f)(a,b); /*用指针调用函数*/
printf("%d \n%d \n",c,d);
return 0;
}

如果函数指针遇到 typedef 呢?
请往下看

#include <stdio.h>
#include <stdlib.h>
int func(){return 0;}
int main(){
typedef int (*K)(); /*定义函数指针类型K(相当于C++、java中定义了一个类)*/
K k; /*声明函数指针类型变量k*/
k= func; /*将func 函数入口地址赋给 函数指针变量 k*/
int i=k();
printf("%d \n",i);
return 0;
}

8、内存泄露和野指针
[quote]内存泄露:指针销毁了,并不表示所指的空间也得到了释放;
野指针:内存被释放了,并不表示指针也被销毁了或指向NULL;[/quote]
9、NULL与""的区别

10、宏定义(#define)
#include <stdio.h>

#define D1 3.14
#define D2 (x+y)
#define D3(x,y) (x>y?x:y)

int main(void){
int x=6,y=2;
double d1=D1;
int d2=D2;
int d3=D3(x,y);
printf("d1=%f,d2=%d,d3=%d\n",d1,d2,d3);
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值