《指针用法总结》

  • 格式:doc
  • 大小:2.48 MB
  • 文档页数:46

原创:《指针用法总结》,欢迎各位坛友学习,交流,批...

[复制链接]

aa一蓑烟雨

81

积分 67

莫元 0

飞币

注册会员

 发消息 电梯直达

1楼

发表于 2014-9-7 17:04:02 | 显示全部楼层 |只看大图

指针用法总结

参考文献:[1] 谭浩强 《C程序设计》清华大学出版社

[2] 林锐 《高质量C++/C编程指南》

[3] 郝斌 《C语言自学视频》

1 指针的基本性质

指针就是地址

一个指针变量只存放首字节地址,但指向整个变量,只占4个字节(无论指向什么类型)

2 指针的重要性

表达一些复杂的数据结构。

快速的传递数据,减少了内存的耗用。

使函数返回一个以上的值。

能直接访问硬件。

能方便的处理字符串(到’\0’停止)

是理解面向对象语言中引用的基础。

3 指针的指针

跨函数改变变量的值使用指针。

跨函数改变指针的值使用指针的指针。(示例1)

操作数组用指针,操作指针数组用指针的指针

4 指针与数组

通过指针操作数组

1) 数组名a代表数组首元素的地址,a是常量。

2) 通过指针操作数组、字符串占用内存空间更少、运行效率更高。

指针数组

若一个数组其元素均为指针类型变量,成为指针数组。

例如:“ int *p[4]; ”

指针数组比较适合用于指向若干个字符串,使字符串的处理更加方便灵活。

例如:

char *name[] = {“Fow”,”me”,”ku”,”qi”};

void print(char *name[], int n) print(name, n);

指针数组做main函数的形参(实参有操作系统给出)

5 指针与函数

通过指针引用函数

函数名就是指向函数入口地址的指针。一个程序中,一个指针变量可以先后指向同类型的不同函数。

int max(int, int); //函数声明

int (*p)(int, int); //定义指向函数的指针变量p

p = max; //使p指向max函数

c = (*p)(a, b); //通过指针变量调用函数max

函数的入口参数为指针

1) 所要传递数据为非标准数据类型时更高效。

2) 可在函数中修改变量的值。

3) 使用const可防止数据被篡改。

4) 当该入口参数为指向函数的指针,优点?(例3)

void fun(int(*X1)(int),int(*X2)(int,int)

{ int a, b,i, j;

a = (*X1)(i);

b = (*X2)(i,j);

}

上例中用(*X1)、(*X1)代替函数f1、f2。当函数fun调用的函数不固定时,这样比较方便。

函数的返回值为指针

一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址。其概念与之前相似,只是返回的值的例如 “int *a(int x, int y);”

6 指针与动态内存

动态内存的构造

Malloc/free必须成对使用,谁申请谁销毁,申请后要检验是否申请成功;销毁后要将指针置为NULL。(示例2)

动态数组 VS 静态数组,优点?

1) 数组长度可变(realloc)。

2)内存存毁由程序员自己控制。

3) 可以跨函数使用。

7 指针变量的归纳比较

变量定义 类型标示 含义

int i; int 定义整型变量i

int *p; int * 定义p为指向整型数据的指针变量

int a[5]; Int[5] 定义整型数组a,他有5个元素

int *p[4]; int *[4] 定义指针数组p,他由4个指向整型数据的指针元素组成

int (*p)[4]; int (*)[4] P为指向包含4个元素的一维数组的指针变量

int f(); int() f为返回整型函数值的函数

int *p(); int *() f为返回一个指针的函数,该指针指向整型数据

int (*p)(); int (*)() P为指向函数的指针,该函数返回一个整型数

int **p; int ** P为一个指针变量,它指向一个指向整型数据的指针变量 void *p; void * P是一个指针变量,基本型为void(空类型),不指向具体的对象,在将它的值赋给另一指针

示例1

#include

#include

void main()

{

Int *p;

fun(&p);

}

/*

* 函数介绍:使main函数中指针p指向一个合法的整型单元

* 输入参数:q,指向指针变量的指针

* 输出参数:新开辟的整型内存地址

* 返回值 : 无

*/:

int fun(int **q)

{

*q = (int *)malloc(4);

}

示例2

char *p=malloc(„);

if(p==NULL)

„;

function(p);

free(p);

p=NULL;

而函数function则接收参数p,如下:

void function(char *p)

{

„ /* 一系列针对p的操作 */

}

Tips:sizeof(数据类型);

示例3:(p271)

题目:有两个整数a和b,有用户输入1,2或3。如输入1,程序就给出a和b中大者,输入2,就给出a和b中小者,输入3,#include int main() { void fun(int x, int y, int(*p)(int,int));

int max(int, int);

int min(int, int);

int add(int, int);

int a = 34, b = -21, n;

print(“please choose 1,2 or 3:”);

scanf(“%d”, &n);

//用if语句判断该使用哪个函数

if(n == 1) fun(a, b, max);

else if(n == 2) fun(a, b, min);

else if(n == 3) fun(a, b, add);

return 0;

}

int fun(int x, int y, int(*p)(int, int))

{ int result;

result = (*p)(x,y);

print(“%\n”, result);

}

int max(int x, int y)

{ int z;

if(x > y) z = x;

else z = y;

print(“max =”,);

return(z);

}

int min(int x, int y)

{ int z;

if(x < y) z = x;

else z = y;

print(“min =”,);

return(z);

}

int add(int x, int y)

{ int z;

z = x + y;

print(“sum =”,);

return(z);

}

论坛公益广告:使用360产品将会被封锁ID。周流氓wuzhujian

1126

积分 1112

莫元 0

飞币

金牌会员

 发消息 2楼

发表于 2014-9-7 17:19:05

| 只看该作者

我举个例子,能回答出来,算是C语言的指针操作及格。

void test(char* p)

{

p = "abc";

}

main()

{

char * t= "bcd";

test(t);

printf("%s", t);

}

问题1:请问输出的是什么?

问题2:请说明输出该结果的原因。

灵活使用C语言中的指针,关键在于指针的“强制类型转换”。

承接工业控制、短距无线通信、工业以太网项目。wuzhujian@

回复

举报

公益广告:发表新主题时,务必起一个能说明帖didadida

405

积分 250

莫元 90

飞币

中级会员 3楼

发表于 2014-9-7 17:24:20 | 只看该作者

wuzhujian 发表我举个例子,能回答出来,

void test(char* p)

内容不变。

C是按照值传递的,不是引用传递,在函数中实际是有一个参数的拷贝过程,因此不会改变原有指针的指向

想改变指针本身,用指向指针的指针