• C语言学习笔记 (007)


    1.数组指针:即指向数组的指针 
    那么, 如何声明一个数组指针呢?

    1 int (* p)[10]; /*括号是必须写的,不然就是指针数组;10是数组的大小*/

    拓展:有指针类型元素的数组称为指针数组。 
    2.通过指针引用数组元素的基本方法 
    (1)小标法:a[i]。 
    (2)指针法:* (a+i) 或 * (p+i) 或 p[i]。其中,a是数组名,p=a,即p指向数组a首元素的地址。 
    问:为什么* (a+i) 和* (p+i)是等价的,或者说是引用的同一个数组元素呢? 
    答:在C语言中,数组名代表的是数组中首元素的地址。在程序编译时,a[i]是按*(a+i)处理的,即按数组元素的首地址加上相应位移量i找到新元素的地址。而p=a,即p是指向数组a的首元素的地址,因此是等价的。从这里可以看出,[ ]实际上是变地址运算符,即将a[i]按a+i计算地址,然后找此地址单元中的值。 
    问:为什么p[i] 和* (p+i)是等价的,或者说是引用的同一个数组元素呢? 
    答:c语言规定,当指针变量指向数字元素时,指针变量可以带下标。而在程序编译时,对此下标处理的方法是转换为地址,即对p[i] 处理成 (p+i)。同上,[ ]是变址运算符。 
    3.利用指针引用数组元素 
    (1)p++; *p; 
    (2)*p++;等价于*(p++);因为++和*的优先级一样,故结合方向是从右向左。 
    (3)*(p++);和*(++p);二者是有区别的。前者是先取*p的值,然后p加1;后者是先p加1,再取p的值。即如果p指向的是数组a元素a[0],则前者得到a[0]的值,后者得到a[1]的值。 
    (4)++(*p);将p指向的元素的值加1。 
    (5)如果p指向元素a[i], 
    *(p--);先得到p指向的地址的元素a[i],然后p减1。 
    *(++p);执行结果得到a[i+1],p加1。 
    *(–p);执行结果得到a[i-1],p减1。

    4.利用指针输出数组元素

    1 int a[10];
    2 int * p;
    3 p = a;
    4 while(p<a+10)
    5 printf("%d",*p++);

    1 int a[10];
    2 int * p;
    3 p = a;
    4 while(p<a+10)
    5 {
    6    printf("%d",*p);
    7    p++;
    8 }

    1 int a[10];
    2 int * p;
    3 p = a;
    4 for(i=0;i<10;i++)
    5 printf("%d",*p++);

    1 int a[10];
    2 int * p;
    3 for(p=a;p<a+10;p++) /*比较专业的写法,代码简洁、高效*/
    4 printf("%d",*p);

    思考:下面代码能不能正确输出数组元素的值呢?

    1 int a[10];
    2 int * p;
    3 for(p=a;p<a+10;a++) 
    4 printf("%d",*a);

    答:是不行的。因为数组名a代表的是数组首元素的地址,是一个指针型常量,它的值在程序运行期间是不改变的,即a++是不变的。

    因此,结合动态分配数组,我们可以建立一个一维的数组指针:

    int (* array)[N]=(int *)malloc(N*sizeof(int));
  • 相关阅读:
    Laravel5.0学习--01 入门
    MySQL账户安全设置
    360路由器c301最新固件支持万能中继
    PsySH:PHP交互运行环境
    PHP-CS-Fixer:格式化你的PHP代码
    JVM 类加载机制详解
    Java虚拟机(JVM)概述
    聊一聊 Spring 中的线程安全性
    Java 里如何实现线程间通信
    Java 数据结构
  • 原文地址:https://www.cnblogs.com/jikexianfeng/p/7347579.html
Copyright © 2020-2023  润新知