十三、 指针
Ø 指针变量的声明:类型名 * 指针变量名;
Ø 通过指针变量访问它所指向的普通变量的值
先将普通变量的地址赋值给指针变量,再通过指针运算符* 得到普通变量的值。
int *p,x,y;
x=3;
p=&x;
则printf(“%d”,*p);会打印出3即x的值
y=*p;则y的值变为3
*p=5;则x的值变为5
Ø 指针变量加上(减去)一个位移的效果
若指针变量存入的是数组元素的地址,则其加一减一得到的是那个数组元素下一个或前一个元素的地址。
int a[10];p=&a[3];
*p得到的是a[3]的值。
若p++;此时p存放的是a[4]的地址&a[4]; *p得到的就是a[4]的值。
或p--;此时p存放的是a[2]的地址&a[2],*p得到的就是a[2]的值。
Ø 行指针
i.主要是对于二维数组来说的,二维数组每行都有自己的地址,第0行地址用数组名表示,第i行地址为数组名+i;而想要得到二维数组里一个元素的地址,必需先得到其所在行的地址,然后再由那个地址得到元素的地址,比如说 int a[3][4];定义了一个二维数组,该二维数组第0行的地址为a,第1行的地址为a+1,第2行的地址为a+2,想从行的地址得到元素的地址,需在行地址前加上指针运算符“*”,即*a就是第0行首个元素的地址即a[0][0]的地址,而a[0][2]的地址就是在a[0][0]的地址基础上加上位移量2,即*a+2,然后想得到a[0][2]这个元素的值呢就再加上一个指针运算符“*”,即*(*a+2),类似地,想得到a[2][2]这个元素的值呢就是*(*(a+2)+2)
ii. 定义行指针变量:类型名 (*变量名)[数组长度];
如int (*p)[4],a[3][4]; p=a;此时就可把p当成a来用,用法同上所述。
Ø 判断是否合法访问数组元素:若是指针法访问,判断指针后跟的是否地址;若是下标法访问,判断下标有无越界。
Ø 函数指针:函数名即为函数的地址(指针)
i. 函数指针变量的定义:类型名 (*变量名) (形参列表);如 int (*p)();
ii. 赋值:指针变量=函数名;设有个函数其函数名为max,则要将该函数的地址给p的话只要执行如下语句即可p = max;
Ø 指针数组:指针数组的数组元素都是指针变量,是用来存放变量的地址的,定义格式为类型名 * 变量名[数组长度]; 如int* p[10];
Ø 指向指针的指针:指针变量也是一种变量,故在内存中也有对应的一个地址,而要存放指针变量的地址,就要求助于用来存放指针变量的地址的指针变量,定义格式 类型名** 变量名;如 int *p1; int **p2;int a=3;可进行赋值p1=&a;p2=&p1; 则a 、*p1和**p2的值都是3.
//用指针将俩句英文句子连接起来
#include<stdio.h>
#define N 100
#include<string.h>
voidf(char *s1,char *s2,char *s3)
{
while(*s1)
*s3++=*s1++;
while(*s2)
*s3++=*s2++;
*s3='\0';
}
intmain(){
char a[N],b[N],c[N];
gets(a);
gets(b);
f(a,b,c);
puts(c);
}