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

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

指针运算

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;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值