一、指针
所谓指针,就是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。这里介绍一小部分;
首先,介绍声名指针变量:
int p; //一个整形数p;
int *p; //一个指针p;
int p[50]; //一个数组p,其中的所有数据均为int;
int *p[50]; //一个数组p,其中的数据类型均是指针;
这里要注意:int p;是定义了一个整型数p;所以int *p;首先是定义了一个整型数*p;并且你所定义的指针即为p(这里指向p的地址);
二、运算符&和*
这里&是取地址运算符,*是间接运算符。
&a 的运算结果是一个指针,指针的类型是a 的类型加个*,指针所指向的类型是a 的类型,指针所指向的地址嘛,那就是a 的地址。
*p 的运算结果就五花八门了。总之*p 的结果是p 所指向的东西,这个东西有这些特点:它的类型是p 指向的类型,它所占用的地址是p所指向的地址。
例如以下程序:
#include<stdio.h>
int main()
{
int a,b;
int *p;
while(scanf("%d%d",&a,&b)!=EOF)
{
p=&a;
b=*p+5;
printf("%d",b);
}
}
首先,输入整型数a,然后,再将a的值赋给指针p,特别注意这里一定要都是指向地址的变量才对;最后,再将b由*p+5运算得出,运行的结果就是把a的值加上5;
一个简单的换数:
#include<stdio.h>
void swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
int main()
{
int a,b;
int *pointer1,*pointer2;
while(scanf("%d%d",&a,&b)!=EOF)
{
pointer1=&a;
pointer2=&b;
if(a<b)
{
swap(pointer1,pointer2);
}
printf("%d %d\n",a,b);
}
}
三、指针与数组
先看下面一个程序;
#include<stdio.h>
void main(){
int a[20];
int *p,*q;
p=&a[3];
q=&a[18];
printf("q-p=%d\n",q-p);
}
算出来运行结果了吗?没错就是q-p=15,这里的p和q分别指向的是a[3]和[18]的地址,即为p=3,q=18;在这里a[3]和a[18]都是数组啊中的一个整型数据,在对其取地址&a[3],&a[18],意为在给指针p、q赋值运算,延伸一下如果再对p做运算p+1,则为将p移向下一个地址,即为&a[4],而*p也就是a[4];
下面来看给一个数组逆序:
#include<stdio.h>
void invert(int *p,int n){
int i;
int temp;
for(i=0;i<=(n-1)/2;i++){
temp=*(p+i); //p+i为第i个数,
*(p+i)=*(p+n-i-1); //p+n-i-1为第n-i-1个数,与p+i位置对称;
*(p+n-i-1)=temp; //把正数第i个数与倒数第i个数交换;
}
}
void main()
{
int a[10]={1,3,5,7,9,1,3,5,7,9};
int i,*p;
void invert();
p=a; //把数组a赋给指针p,数组不用取地址&;
for(i=0;i<10;i++)
{
printf("%-5d",a[i]);
}
printf("\n");
invert(p,10); //代入函数invert,代入指针p,不要加*,就像把数组代入函数中一样;
for(i=0;i<10;i++)
{
printf("%-5d",a[i]);
}
}
运行结果如下:可以看到还是很耗时间的。
四、更多
参见更多指针的详细用法及问题说明请见: C语言指针详解(经典,非常详细)