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