一、简易认识指针
指针通常来说是存储内存地址的,并且指针本身就是一种类型,就像整型,浮点型一样,这个一会再说,先看一个简单的例子:
#include <stdio.h>
int main()
{
int a = 3;
int *p ;
p = &a;
*p = 111;
printf("a = %d.\n",a);
return 0;
}
运行结果:
a = 111.
这是一个最简单的指针运用了,理解了这个对以后的更高级的才能理解。来看一下这例程:
最核心的代码为中间的三行,理解了这三行,就可以认识到指针究竟是什么鬼了。可以通过下面的图片来认识。
假设变量a的内存地址为0x7f7f7f,然后执行p = &a之后,那么变量p所对应的内存中将存储a的地址。当*p时通过存储的地址从而间接找到变量a。
二、指针与数组
对于数组来说,数组的首元素地址和数组的地址是一样的,从而对于一个指针来赋值的话可以使用两种方式:
#include <stdio.h>
int main()
{
int i = 0,a[5] = {1,2,3,4,5};
int *p;
p = a;
//p = &a[0];一般不使用这种方式
printf("使用数组下标的方式来访问数组元素\n");
for(i = 0;i < 5;i++)
{
printf("a[%d]:%d\n",i,a[i]);
}
printf("使用指针的方式来访问数组元素\n");
for(i = 0;i < 5;i++)
{
printf("*(p+%d):%d\n",i,*(p+i));
}
return 0;
}
其运行结果如下:
使用数组下标的方式来访问数组元素
a[0]:1
a[1]:2
a[2]:3
a[3]:4
a[4]:5
使用指针的方式来访问数组元素
*(p+0):1
*(p+1):2
*(p+2):3
*(p+3):4
*(p+4):5
三、指针的运算
指针变量本身存储的是某个变量的地址值,因此对于一些运算是没有价值和意义的。有意义的加法,减法、++、--。
*、++、--这三个运算符都是从右向左,因此谁在右边,先算谁。从而*p++ = *(p++) = *p、p+=1 .++放在后面,与放在前面不同,举例3 + (++i) 与3 + (i++)结果是不同的。
#include <stdio.h>
int main()
{
int i = 0,a[5] = {1,2,3,4,5};
int *p;
p = a;
printf("*p++:%d\n",*p++);
p = a;
printf("*++p:%d\n",*++p);
p = a;
printf("++(*p):%d\n",++(*p));
p = a;
printf("(*p)++:%d\n",(*p)++);
return 0;
}
运行结果:
*p++:1
*++p:2
++(*p):2
(*p)++:2
分析这四个运算,注意++的先算和后算,并且注意++的作用对象是地址还是值本身。
四、函数传参中使用指针
C语言中函数传参,实参并不是直接传给形参,而是实参先进行一份拷贝,然后将拷贝的传到形参,所以在函数中对形参的改变并不会影响主函数中两个变量的值。因此引入指针。传递变量的地址,在该地址上的操作最终会在变量输出时得到展示,因此传指针,在子函数中对变量的操作,将会改变函数外边的实参。
#include <stdio.h>
void swap(int a,int b);
int main()
{
int a,b;
a = 3;
b = 5;
printf("a = %d,b = %d\n",a,b);
swap(a,b);
printf("a = %d,b = %d\n",a,b);
return 0;
}
void swap(int a,int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
普通函数的传参演示:
a = 3,b = 5
a = 3,b = 5
下面是利用指针作为函数参数传递:
#include <stdio.h>
void swap(int *p,int *q);
int main()
{
int a = 3,b = 5;
int *p,*q;
p = &a;
q = &b;
printf("a = %d,b = %d\n",a,b);
swap(p,q);
printf("a = %d,b = %d\n",a,b);
return 0;
}
void swap(int *p,int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
运行结果为:
a = 3,b = 5
a = 5,b = 3
在这个例子中需要注意的是,定义两个指针变量时的格式样子。int *p,*q;这样定义才可以,而不能是 int *p,q;这样的话q并不是指针变量而是一个普通的整型变量。