王老师 指针 第二讲

原创 2006年05月20日 20:13:00

(7)二级指针

指向一级指针的指针.

类似的,可有更高级的指针.

(8)指向数组的指针

声明语法: 类型名 (*变量名)[表达式1]...[表达式n];

(9)指向函数的指针

声明语法: 值类型 (*指针名)(形参表);

运算与用途:

1.赋值

2.调用语法 (*函数指针)(实参表);

3.可作函数参数

4.可作函数值

5.可作数组元素

(10)复合说明项

在c语言中,处理声明语句时,遇到[]处理成数组;遇到*处理成指针;遇到()处理成函数;
但是,
1.不能有元素为函数的数组,但是可以有元素为函数指针的数组;
2.不能有函数值是函数的函数,但是函数值可以是指向函数的指针;
3.不能有函数值是数组的函数,但是函数值可以是指向数组的指针.

示例程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void show(int array[]);
void swap_1(int **a, int **b);
void swap_2(int **a, int **b);

double g(double a, double b, double (*fp)(double));

//注意,c语言中的抽象说明符 ??
double g(double, double, double (*)(double));

double y(double x);

//自己实现scanf
void scanf_m(char *c, void *p);

void main()
{
 int i;
 
 /*
 * 二级指针
 */
 int array[10], *p[10];
 int **q;
 
 for(i = 0; i < 10; i++)
  p[i] = &array[i];
 
 //为q赋初值
 q = p;
 
 //下面的语句只能给array[0]赋值
 for(i = 0; i < 10; i++)
  **q = i;
 
 //应改为
 for(i = 0; i < 10; i++)
 {
  **q = i;
  q++;  
 }
 
 //下面的程序会出错
 /*
 for(i = 0; i < 10; i++)
 {
 *q = ++ *q; 
 printf("%d ", **q);
 }*/
 
 //show(array);
 
 //使用二级指针,交换两个指针的指向
 int u = 1, v = 2, *pointer = &u, *qointer = &v;
 
 swap_1(&pointer, &qointer);
 //printf("%d, %d/n", u, v);
 //printf("%d, %d", *pointer, *qointer);
 
 //swap_2(&pointer, &qointer);
 //printf("%d, %d/n", u, v);
 //printf("%d, %d", *pointer, *qointer);
 
 /*
 * 指向数组的指针:一个指针,所指对象是数组,例如:
 */
 int (*pa)[10], a[5][10];
 pa = a;
 printf("pa = %d/n", pa);
 
 //pa + 1跨过了40个字节
 printf("pa + 1 = %d/n", pa + 1);
 
 int (*qb)[5][10], b[1][5][10];
 qb = b;
 
 /*
 * 在c语言中, 不论p是什么样的指针, p[i] = *(p + i)总成立.
 */
 for(i = 0; i < 5; i++){
  for(int j = 0; j < 10; j ++){
   a[i][j] = i;
  }
 }
 int (*pb)[10] = pa + 5;
 //打印数组元素
 for(; pa < pb; pa++)
 {
  printf("%d ", **pa);
  printf("%d ", *(*pa + 9));
 }
 printf("/n");
 
 /*
 * 指向函数的指针:一个指针,值为函数入口地址
 */
 printf("%f/n", g(0, 10, y));
 printf("%f/n", g(0, 3.1415926, sin));
 
 /*
 * 复合说明项
 */
 
 //例1.windows消息映射,使用了元素为函数指针的数组,而不是一个大的switch语句.
 //例2.返回值是指向一个函数的指针,用的不多.
 //例3.返回值是指向数组的指针
 
 //指针的强制类型转换
 int intTemp = 0;
 double flTemp = 0;
 char chTemp[100];
 char ch = 'd';
 scanf_m(&ch, &intTemp);
 ch = 'f';
 scanf_m(&ch, &flTemp);
 ch = 's';
 scanf_m(&ch, chTemp);
 printf("%d, %f, %s/n", intTemp, flTemp, chTemp);
}

/*
* 输出数组
*/
void show(int array[])
{
 int i = 0;
 for(i = 0; i < 10; i++)
 {
  printf("%d ", array[i]);
 }
}

/*
* 下面的2个程序交换两个指针指向的内容
*/
void swap_1(int **a, int **b)
{
 int *x = NULL;
 x = *a;
 *a = *b;
 *b = x;
}

void swap_2(int **a, int **b)
{
 int **x = NULL;
 //下面的程序会报错,x的值不定,说不定指到哪.
 *x = *a;
 *a = *b;
 *b = *x;
}

/*
* 积分计算
*/
double g(double a, double b, double (*fp)(double))
{
 int i = 0;
 double s = 0;
 double d = (b - a)/10000;
 
 for(; i < 10000; i++){
  s += (*fp)(a + i * d + d / 2) * d;
 }
 return s;
}

double y(double x)
{
 return x;
}

//复合说明项
//error1: array element type cannot be function
//int a[10](int *, int);

//error2:
/*
int f1(int);
int f2(int);
int f(int x)
{
if(x > 0)
return f1;
else
return f2;
}*/
//例2.返回值是指向一个函数的指针:
//f是一个函数,形参是x,返回值是一个函数指针:其形参是float型,返回double.
double (* f(int x))(float);

//error3:function returns array
//int f()[10];
//例3.返回值是指向数组的指针
int (* fun(int))[10];

//自己实现的scanf()函数
void scanf_m(char *c, void *p)
{
 char a[100], *s = a, *r;
 while(*s = getchar(), *s != '/n')
  s++;
 *s = '/0';
 
 if(*c == 'd')
 {
  *(int *)p = atoi(a);
  return;
 }
 
 if(*c == 'f')
 {
  *(double *)p = atof(a);
  return;
 }
 else
 {
  s = a;
  r = (char *)p;
  while(*r ++ = *s ++);
 }
}

FPGA王老师问答

  • 2013年07月12日 16:41
  • 37KB
  • 下载

王老师ajax

  • 2013年01月07日 08:59
  • 5.1MB
  • 下载

王老师讲解:SQL Server 2005数据库nolock的使用【来自Aisino_BBS】

前两天去安徽航天信息解决A6系统的性能问题,去之前进销存项目组研发人员小苏和小卢把他们认为性能 有问题的SQL已经发给了我,我把优化方法提交给了他们。本以为到那之后会非常轻松,但还是有些插曲在其中。 ...

大四用的网络技术王老师教的03

  • 2010年08月30日 11:46
  • 5.04MB
  • 下载

大四王老师教的技术02

  • 2010年08月30日 11:37
  • 9.46MB
  • 下载

王老师拼音输入法的算法

N元语言模型的解码算法 分类: 微软拼音输入法开发工程师专栏2011-02-28 16:11 8155人阅读 评论(11) 收藏 举报 ----------------------...
  • fish341
  • fish341
  • 2012年07月02日 17:55
  • 9430

HTML5的优点及缺点,汇道科技王老师来解答

HTML5的优缺点是什么?作为HTML的第五次重大修改,HTML5有哪些改进?HTML5又有哪些缺点?   HTML5本身是由W3C推荐出来的,它的开发是通过谷歌、苹果,诺基亚、中国移动等几百家公司...

第一次用博客之有所想——致敬王老师

本篇文章不是技术文章。只是我个人对目前状况的总结与反思。

【传智播客】PS中的魔棒工具-王老师第一次作业!

传智播客( http://icd.itcast.cn/)是一家网页平面设计培训学院,专注于网页设计培训,平面设计培训,fash培训,ui设计培训。   【传智播客】 王老师 免费视频教程...

小博老师解析Java核心技术 ——AJAX第二弹

[引言] 上一回小博老师和大家聊了AJAX的原理与对应前端实现代码,那服务器是怎么接收客户端的请求并作出回应的呢。这回小博老师与大伙唠唠,AJAX的完整执行流程与服务器侧代码的实现。   [执行...
  • bwf_erg
  • bwf_erg
  • 2017年01月22日 21:57
  • 83
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:王老师 指针 第二讲
举报原因:
原因补充:

(最多只允许输入30个字)