C语言学习篇-9指针运算、指针与数组

来源:互联网 发布:阿里云搭建http代理 编辑:程序博客网 时间:2024/05/02 01:53

说明:本文主要阐述指针的基本运算及算术运算,指针与数组的关系,指针与字符串的关系。

指针运算

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 = 0x7fff5fbff750pb = 0x7fff5fbff74cpa = 0x7fff5fbff760pb = 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;}
0 0
原创粉丝点击