说明:本文主要阐述指针的基本运算及算术运算,指针与数组的关系,指针与字符串的关系。
指针运算
1.指针的基本运算包括取地址以及取值运算等运算。
单目运算符“&”是取操作对象的地址,“*”是取指针指向的对象的内容,两个互为互逆运算。
示例:
int a = 10,*p;
p = &a;//p指针指向了a所在的地址,&a就是将a所在的地址取出来;
*p = 90;//p指向的地址内容由10修改为90,这时a等于90;
2.指针的算术运算
指针的算术运算与其基类型有关,所谓的基类型就是所定义的变量的类型。
示例:
#include <stdio.h>
int main() {
double a = 10.6;//double类型的a,基类型为double,占8个字节地址
int b = 89.5;//int类型的b,基类型为int,占4个字节地址
double *pa = &a;//指针赋值
int *pb = &b;
printf("pa = %p\n",pa);//打印初始地址
printf("pb = %p\n",pb);
pa += 2;//指针变量加2
pb += 2;
printf("pa = %p\n",pa);//打印加1后的地址
printf("pb = %p\n",pb);
return 0;
}
运行结果:
pa = 0x7fff5fbff750
pb = 0x7fff5fbff74c
pa = 0x7fff5fbff760
pb = 0x7fff5fbff754
从运行结果可以看出,pa指针在加2运算后,地址增加了16,而pb加2运算后指针所指向的地址增加了8,这是为什么呢?没错,就是加上了基类型所占的字节数乘以n。假设指针所指向的地址为a,在进行加n运算后,所指向的地址为基类型所占字节*n再加上a,指针减法运算同理。
3.指针与数组
先定义一个数组:int array[4] = {3,5,6,7};
在这里,array为数组名,在计算机中代表的是该数组的首地址,即*array会等于3;这里array可以看做是一个常量,不可以使用自加之类的运算。
再定义一个指针变量int *parr; parr = array;
parr是一个指针变量,parr = array的含义为将数组array的首地址赋值给parr值,现在我们可以通过parr指针就可以访问整个array数组,但是parr指针本质并没有改变,依然是一个指针变量,它不能够代表整个数组的内存,相当于是array的一个代表,可以处理数据,但是没有所有权。由于parr依然是指针变量,所以我们可以对它进行自加之类的运算,例如:parr++;
自加之后parr指针指向了&array[1];也可以通过parr指针访问数组里面的元素,例如:*parr;
看文字不爽?上代码:
#include <stdio.h>
int main() {
int array[4] = {3,5,6,7};
printf("%d\n",*array);//打印3
//array++;//编译不通过,会报错,array是常量,不能够执行自加运算
int *parr = array;//array数组的代表登场
*parr = 8;//代表说我有权更改数据
printf("%d\n",array[0]);//打印8
parr++;//由于代表是指针类型,有自己的特殊功力,开始自加
printf("%d\n",*parr);//5
printf("%d\n",array[1]);//5
return 0;
}
总结
1.指针在C语言中可以灵活的运用;
2.数组名为数组所存储空间的首地址。
练习
1.求下面程序的运行结果?为什么?答案
#include<stdio.h>
int main(void){
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d\n",*(a+1),*(ptr-1));
return 0;
}