王老师 指针 第一讲

本文详细介绍了指针的概念、定义语法、运算操作等基础知识,并通过示例程序展示了指针作为函数参数的应用,包括查找最大最小值、排序等功能,还涉及指针数组的使用。

(1)概念:一块内存区域的地址

两重含义:

1.起始地址

2.长度

(2)定义语法:

类型名 * 变量名;

(3)指针运算

指针表达式:一个表达式,值是指针.

(4)指针做函数参数

(5)返回函数的指针

(6)指针数组

示例程序代码如下:

/*
* 2006.5.13
*/
#include "stdio.h"
#include "stdlib.h"
void findMaxAndMin(int array[], int n, int *p, int *q);
int *findMax(int array[], int n);
void sort(int array[], int n);
int buildeDic(char *dic, char *pointer[]);

void main(int argc, char * argv[])
{
 for(int i = 1; i < argc; i++)
 {
  printf("%s/n", argv[i]);
 }
 
 /*
 * 指针运算:
 * 1.取地址
 * 2.赋值
 */
 int a = 3, *p = &a;
 
 /*
 * 3.取内容
 */
 *p = *p + 1;
 printf("%d/n", *p);
 
 /*
 * 4.指针表达式+-整数n
 */
 int array[10];
 for(i = 0; i < 10; i++)
  array[i] = i;
 
 p = array;
 for(i = 0; i < 10; i++)
 {  
  printf("%d/n", p);
  p = p + 1;
 }
 
 /*
 * 5.自增减
 */
 p = array;
 printf("p++: %d/n", p++);
 printf("++p: %d/n", ++p);
 
 /*
 * 6.同类指针相减
 */
 p = array;
 int *q = p;
 q = q + 10;
 printf("q - p = %d/n", q - p);
 
 /*
 * 7.关系运算
 */
 for(; p < q; p++)
 {
  printf("%d/n", *p);
 }
 
 /*
 * 8.逻辑运算
 */
 /*
 * error!!!
 *  int *pointer;
 *   pointer = 3;
 */
 int *pointer = NULL, *qointer = NULL;
 if(pointer && qointer)
  *pointer = 3;
 
  /*
  * 9.强制转换
 */
 double d = 1.0;
 char *c = (char *)&d;
 
 /*
 * 指针做函数参数,形参数组.
 */
 int max, min;
 findMaxAndMin(array, 10, &max, &min);
 printf("max: %d, min: %d/n", max, min);
 
 sort(array, 10);
 for(i= 0; i < 10; i++)
  printf("%d, ", array[i]);
 
 /*
 * 指针数组
 */
 char dic[1000];
 char *dic_pointer[100];
 buildeDic(dic, dic_pointer);
 
}

/*
* 指针做函数参数,形参数组.
* 如果想要利用函数的参数返回计算结果,需要做到以下三点:
* 1.形参为指针
* 2.函数中有赋值语句
* 3.使用传址方式调用函数
*/
void findMaxAndMin(int array[], int n, int *p, int *q)
{
 int i, max, min;
 for(max = min = array[0], i = 1; i < n; i++)
 {
  if(array[i] > max)
  {
   max = array[i];
  }
  else
  {
   if(array[i] < min)
    min = array[i];
  }
 }
 *p = max;
 *q = min;
}

/*
* 返回指针的函数
*/
int *findMax(int array[], int n)
{
 int *max, *p = array + n;
 for(max = array; array < p; array++)
 {
  if(*max < *array)
   max = array;
 }
 return max;
}

/*
* 选择排序,调用指针函数findMax
*/
void sort(int array[], int n)
{
 int x, *max;
 while(n > 1)
 {
  max = findMax(array, n);
  x = *max;
  *max = array[n - 1];
  array[n - 1] = x;
  n--;
 }
}

/*
* 指针数组:一个数组,每个元素都是指针
*/
int buildeDic(char *dic, char *pointer[])
{
 printf("please input words, space by tab, ends with #./n");

 int num = 0;
 pointer[0] = dic;

 while(1)
 {
  *dic = getchar();
  if('a' < *dic && 'z' > *dic)
  {
   dic++;
   continue;
  }
  if(*dic == ' ')
  {
   *dic ++ = '/0';
   num++;
   pointer[num] = dic;
  }else{
   *dic = '/0';
   num++;
   return num;
  }
 }
}

王老师 现在有 n 个字符串,聪明的小 Z 想要考考王老师 对于字符串的掌握程度。 聪明的小 Z 现在要求王老师 把他的所有字符串按照开头字母 a,b,...,z 分类,每类字符串分别按字典序排序,每类字符串存一个指针,程序开始时指针指向第一个字符串。 现在,聪明的小 Z 会根据这些字符串询问王老师 共 k 个问题。 每次查询,询问某一个字母,要求输出当前指针指向的字符串,然后将这个指针循环右移一位(即指针指向下一个字符串,若已经是该类字符串最后一个,则指向第一个字符串)。 请结合样例理解。 输入格式 第一行输入两个整数 n,k。 接下来 n 行,每行一个字符串。 接下来又有 k 行,每行输入一个要查询的字母 输出格式 共 k 行,每行一个字符串表示答案。 样例输入 1 4 5 zagreb split zadar sisak z s s z z 样例输出 1 zadar sisak split zagreb zadar 样例输入 2 5 3 london rim pariz moskva sarajevo p r p 样例输出 2 pariz rim pariz 样例输入 3 1 3 zagreb z z z 样例输出 3 zagreb zagreb zagreb 提示/说明 样例 1 解释 输入的字符串可以分成以下两类,并且每类字符串按照字典序排序: sisak → split zadar → zagreb 共 5 次询问: 第一次询问,字母 z,显然输出 z 类字符串的第一个字符串 zadar,然后 z 类字符串的指针移动到下一个字符串 zagreb 第二次询问,字母 s,显然输出 s 类字符串的第一个字符串 sisak,然后 s 类字符串的指针移动到下一个字符串 split 第三次询问,字母 s,此时 s 类字符串指针指向的是 split,将其输出,然后 s 类字符串的指针移动到下一个字符串 sisak 第四次询问,字母 z,此时 z 类字符串指针指向的是 zagreb,将其输出,然后 z 类字符串的指针移动到下一个字符串 zadar 第五次询问,字母 z,此时 z 类字符串指针指向的是 zadar,将其输出,然后 z 类字符串的指针移动到下一个字符串 zagreb 数据范围 对于 20% 的数据,n,k≤100。 对于 60% 的数据,n,k≤500。 对于 100% 的数据,n,k≤100000。 输入的字符串长度不超过 21,且仅包含小写字母。c++
08-11
王老师的老千计划 文件 IO比赛题目 时间限制: 1000MS空间限制: 512MB 题目描述 马上就要放暑假了! 王老师把小姜,邹老师,鲁老师叫到一起打牌,他们决定用打牌的方式选出一个赢家。 打牌的规则很简单,每个人手里有一些牌,牌上有一些点数,每一轮由王老师先打出一张牌,然后另外三人可以不出牌,但是要出牌则只能打出点数 严格大于 这张牌的牌,直到王老师手里打完牌后,游戏结束。 每个人最终的得分由打出的所有牌点数之和决定。 现在邹老师和鲁老师已经打完了自己的所有牌,王老师还剩下 n 张牌,小姜还剩下 m 张牌 王老师决定和小姜私下进行了合作——只要王老师帮助小姜成为赢家,那么小姜就带王老师出去玩。 现在王老师想知道,对于剩下的这些牌,怎么出牌可以让小姜获得尽可能大的得分? 输入格式 第一行包含两个整数 n,m 含义如题 第二行 n 个整数 A i ​ ,表示王老师手里每张牌的点数 第三行 m 个整数 B i ​ ,表示小姜手里每张牌的点数 输出格式 输出一行,表示在剩下的这些牌中,小姜能获得最大的得分 样例输入 1 3 4 3 4 7 1 2 4 8 样例输出 1 12 样例输入 2 3 3 10 7 8 4 7 6 样例输出 2 0 样例输入 3 见下发大样例数据 样例输出 3 见下发大样例数据 提示/说明 大样例数据 样例解释1 一种方案为: 王老师先打 3 小姜打 4 王老师再打 4,小姜打 8 最终得分为 4+8=12 样例解释2 无论王老师打什么牌,小姜都没法出牌,得分为 0 数据范围 测试点编号 1≤n,m≤ 1≤A i ​ ,B i ​ ≤ 1∼2 5 1000 3∼4 1000 1000 5∼7 10 5 1000 8∼10 10 5 10 9 贪心,不要使用vector
08-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值