《指针用法总结》
- 格式: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是按照值传递的,不是引用传递,在函数中实际是有一个参数的拷贝过程,因此不会改变原有指针的指向
想改变指针本身,用指向指针的指针