指针小结
来源:互联网 发布:java mvc模式 编辑:程序博客网 时间:2024/04/24 08:30
一维数组与指针:
1》数组名代表数组中第一个元素(即序号为0的元素)的地址。
2》如果指针变量P已指向数组中的一个元素,则P+1指向同一数组中的下
一个元素(而下是将P值简单地加1);P+1所代表的地址实际上是
P+1*d,d是一个数组所占的字节数。
3》如果P的初值为&a[0],则:
1。p+i,a+i,*(p+i),*(a+i),都等效于a[i]的地址
2。指向数组的指针变量也可以带下标如:p[i]与*(p+i)等效;
故而:引用一个数组元素,可以用:
下标法:如形式a[i];
指针法:如*(a+i)或*(p+i)。其中a是数组名,p是指向数组元素的
指针变量。
4》用数组名作函数参数
形式:f(int arr[],int n)或f(int *arr,int n)
C语言调用函数时:当用变量名作为函授数参数时传递的是变量的
值;当用数组名作为函数参数时,由于数组名代表的是数组首元
素地址,因此传递的值是地址,所以要求形参为指针变量。
实际上:C编译都是将形参数组名作为指针变量来处理的
5》在C中字符间的短横杠要加shift键和横杠键才行,如:max_min_value
**数组与指针:
如:int a[m][n] (1=<i<=m;1=<j<=n)
则:
1:a[i]表示第i行首地址,即:a[i][0]的地址
a[i]+j表示第i行第j列的地址,即:a[i][j]的地址
2:用指针的形式表示:
a[i]等效于:*(a+i)
a[i][j]等效于: *(a+i)+j
*(*(a+i)+j)或*(a[i]+j)表示a[i][j]值。
3: int (*p)[n];p=a;
则:(*p)[i] 表示数组a的第i行的首地址,即:a[i][0]
*(*(p+i)+j)或*(p[i]+j)表示a[i][j]值
字符串与指针:
1》 C语言对字符串常量是按字符数组处理的,在内存中开辟了一个
字符数组用来存储该字符串常量。对字符指针变量string的初始
化,实际上是把字符串第一个元素的地址(即字符数组的首元素地
址)赋给string.
定义string的方式:
char *string="I love china!";
等价于:char *string;
string="I love china!";
说明:1。通过字符数组名或字符指针变量可以输出一个字符串;
但是,对一个数值型数组是不能企图用数组名来输出它的
全部元素的!
2。用%s可以对一个字符串进行整体输入输出。
2》对字符串中字符的存取可以用下标法或用指针法
3》字符数组和字符指针变量都能实现字符串的存储和运算,但二者有
区别:
(1)字符数组由若干个元素组成,每个元素中放一个字符;而指针
变量中存储的是地址(即:字符串第一个字符的地址),决不
是将字符串放到字符指针变量中;
(2)赋值方式:对字符数组只能对各个元素赋值,或者是初始化;
对字符指针赋值见上面1》 。
(3)指针变量的值是可以改变的,而数组名虽然代表地址,但它是
常量,其值不能改变。
(4)用指针变量指向一个字符串,可以用它代替printf函数中的格
字符串。
如:
char *format;
format="a=%d,b=%f/n";
printf(format,a,b);
注:只要改变指针变量format所指的字符串,就可以改输入
输出的格式。这种printf函数称为可变格式输出函数。
指向函数的指针:
1》用函数指针变量调用函数
(1) 定义形式:
数据类型 (*指针变量名)(函数参数表列)
(2) 函数调用可以通过函数名调用,也可以通过函数指针调用。
而且,在一个程序中,一个指针变量可以先后指向同类型的
不同函数。
(3) 在给函数指针赋值时,只需要给出函数名而不必给出参数。
如: p=max;//max为一个子函数;不能写成p=max(a,b);
(4) 用函数指针变量调用函数时,只需将(*p)代替函数名即可
如:c=(*p)(a,b);
注:对指向函数的指针变量,像p+n,p++,p--等运算是无意义的
附一函数如下: (经调试过的)
#include<stdio.h>
#include<stdlib.h>
int main()
{
int max(int,int);
int (*p)(int,int);
int a,b,c;
p=max;
scanf("%d,%d",&a,&b);
c=(*p)(a,b);
printf("a=%d,b=%d,max=%d/n",a,b,c);
system("pause");
}
int max(int x,int y)
{
int z;
if(x>y)z=x;
else z=y;
return (z);
}