1.指针是什么?
运行一下代码
#include <stdio.h>
int main()
{
int i = 39;
printf("%d\n", i);
printf("%d\n",&i);
return 0;
}
运行结果:
39
618561996
运行测试代码:
#include <stdio.h>
int main()
{
int i =30;
int *pi;
pi = &i;
printf("%d\n",&i);
printf("%d\n",pi);
printf("%d\n",*pi);
return 0;
}
运行结果:
-316014332
-316014332
30
分析上述代码: int *pi;我们使用“int *pi”声明指针变量 —— 其实是在 内存的某处声明一个一定宽度的内存空间,并把它命名为 pi。
pi = &i;这是返回 i 变量的地址编 号。整句的意思就是把 i 地址的编号赋值给 pi,也就是你在 pi 里面写上 i 的地址编号。
printf("%d\n",*pi);那么*pi 什么意思呢?你只要这样读它:pi 的内容所指的地址的内容(嘻 嘻,看上去好像在绕口令了),就是 pi 这张“纸条”上所写的位置上的那本 “书” —— i 。你看,Pi 的内容是 -316014332,也就是说 pi 指向内存编号为 -316014332 的地址。*pi 嘛,就是它所指地址的内容,即地址编号-316014332上的内容了,当然就是 30 这个“值” 了。所以这条语句会在屏幕上显示 30。
2.通过指针访问数组元素
#include <stdio.h>
int main()
{
int i,*pi,a[]={1,2,3,4,5,6,7,8,9,10};
pi = a;
/*
for(i=0;i<=9;i++){
printf("%d\n",pi[i]);
}*/
for(i=0;i<=9;i++){
printf("%d\n",*pi++);
}
return 0;
}
输出结果:
1
2
3
4
5
6
7
8
9
10
如果将pi修改成a,会出现什么情况呢:
代码:
#include<stdio.h>
int main()
{
int i,*pi,a[]={1,2,3,4,5,6,7,8,9,10};
pi = a;
for(i=0;i<=9;i++){
printf("%d\n",*a);
a++;
}
return 0;
}
运行结果:
原因:数组名不是一个指针变量,而是一个指针常量,所以无法进行++操作。
3.通过指针访问函数
3.1值传递
代码:
#include<stdio.h>
void ExchangeFun(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
printf("x=%d,y=%d\n",x,y);}
int main()
{
int a=4,b=6;
ExchangeFun(a,b);
printf("a=%d,b=%d\n",a,b);
}
运行结果:
x=6,y=4
a=4,b=6
分析:
3.2地址传递
代码:
#include<stdio.h>
void ExchangeFun(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
printf("x=%d,y=%d\n",*x,*y);}
int main()
{
int a=4,b=6;
ExchangeFun(&a,&b);
printf("a=%d,b=%d\n",a,b);
}
运行结果:
x=6,y=4
a=6,b=4
分析:
3.3引用传递
代码:
#include<stdio.h>
void ExchangeFun(int &x,int &y)
{
int temp;
temp=x;
x=y;
y=temp;
printf("x=%d,y=%d\n",x,y);
}
int main()
{
int a=4,b=6;
ExchangeFun(a,b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
运行结果:
x=6,y=4
a=6,b=4
分析: