王老师 指针 第一讲

来源:互联网 发布:百度搜索源码 编辑:程序博客网 时间:2024/03/29 05:06

(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;
  }
 }
}