美文网首页
C程序设计语言04 - 指针与数组

C程序设计语言04 - 指针与数组

作者: 真徐小白 | 来源:发表于2020-01-22 11:39 被阅读0次

指针是保存变量地址的变量

0x00 指针与地址

一元运算符&可用于取一个对象的地址,如: p = &c;, 把变量c的地址赋值给变量p,称p为“指向”c的指针。地址运算符&只能应用于内存中的对象,即变量和数组元素,不能作用于表达式、常量或register类型的变量。

一元运算符*是间接寻址或间接引用运算符。作用于指针时,将访问指针所指向的对象。

指针声明: int *p;,该语句表明表达式*ip的结果是int类型。

0x01 指针与函数参数

由于C语言是以传值的方式将参数值传递给被调用函数,所以调用函数不能直接修改主调函数中变量的值。可以使主调程序将指向所要改变的变量的指针传递给调用函数,这样被调函数可以改变主调函数变量的值。

如:

void swap(int *px, int *py) {
    int temp;

    temp = *px;
    *px = *py;
    *py = temp;
}

0x02 指针与数组

通过数组下标所能完成的任意操作都可以通过指针来实现。一般来说用指针编写的程序比用数组下标编写的程序执行速度快。

“指针加1”意味着指针所指向对象的下一个对象。

数组类型的变量或表达式的值是该数组第0个元素的地址。

int *pa, a[10];
pa = &a[0]; 
pa = a;         //等价于pa = &a[0]; 

一个通过数组和下标实现的表达式可等价地通过指针和偏移量实现。数组名和指针之间的不同之处在于指针是一个变量,而数组名不是,指针可以改变,而数组名不行。

当把数组名传递给一个函数时,实际上传递的是该数组的第一个元素的地址。

在函数定义中,形式参数char s[]char *s是等价的。

0x03 地址算术运算

有效的指针运算包括

  1. 相同类型指针之间的赋值运算
  2. 指针同整数之间的加法和减法运算
  3. 指向相同数组中元素的两个指针间的减法或比较运算
  4. 将指针赋值为0或指针与0之间的比较运算

0x04 字符指针与函数

字符串常量是一个字符数组。字符串常量可以通过一个指向其第一个元素的指针访问。如:

char *pmessage;
pmessage = "now is the time";

0x05 指针数组以及指向指针的指针

指针数组声明

char *lineptr[MAXLINES];

*lineptr[0] 等价于 **ilneptr,前者是是一个指针数组,后者是指向指针的指针,但底层是一样的,因为int a[]; a[0] == *a

0x06 多维数组

二维数组是一种特殊的一维数组,它的每个元素也是一个一维数组。

如果将二维数组作为参数传递给函数,在函数的参数声明中必须指明数组的列数。

一般来说,除数组的第一维可以不指定大小外,其余各维都必须明确指定大小。

注意:

// 下面三种声明作用相同
f(int daytab[2][13]) { ... }
f(int daytab[][13]) { ... }
f(int (*daytab)[13])

0x07 指针数组初始化

char *month_name(int n) {
    satic char *name[] = {
        "Illegal month",
        "January", "February", "March",
        "April", "May", "June", 
        "July", "August", "September",
        "October", "November", "December" 
    };
    ...
}

0x08 指针数组与多维数组

int a[10][20];
int *b[10];

a是一个真正的二维数组,它分配了200个int类型长度的存储单元。b定义仅仅分配了10个指针,并且没有初始化。指针数组的一个重要的优点在于,数组的每一行长度可以不同。

0x09 命令行参数

main(int argc, char *argv[])
// argc表示参数数量,argv是参数的指针数组,程序本身是第一个参数

0x10 指向函数的指针

函数本身不是变量,但可以定义指向函数的指针。

// 函数定义
void qsort(void *lineptr[], int left, int right,
        int (*comp)(void *, void *));

// 函数调用
qsort((void**) lineptr, 0, nlines-1, 
    (int (*)(void*, void*))(numeric ? numcmp : strcmp));

strcmp和numcp是函数地址, 函数不需要使用地址运算符&取值,同数组一样。

通用指针类型void *, 任何类型的指针都可以转换为void *类型,并且在将它转换回原来的类型时不会丢失信息。

int (*comp)(void *, void *))声明中表明comp是一个指向函数的指针,*comp代表一个函数。(*comp)(v[i], v[left])是对指针函数的调用,其中圆括号必须。

相关文章

  • C程序设计语言04 - 指针与数组

    指针是保存变量地址的变量 0x00 指针与地址 一元运算符&可用于取一个对象的地址,如: p = &c;, 把变量...

  • C语言

    C 指针、指针变量、函数指针、指针函数、指针数组、数组指针、C 数组

  • C语言21 指针数组与数组指针

    C语言21 指针数组与数组指针 指针数组的定义 指针数组的赋值 结构体指针数组 分析下面的代码 数组指针的定义 数...

  • 书籍推荐

    1.《C primer plus》----《C程序设计语言》-----《C和指针》、《C专家编程》、《C缺陷与陷阱...

  • 学习笔记3(指针运算,函数参数与指针,数组指针,二级指针)

    一、指针运算 二、数组与指针 三、指针和函数参数 java中: C/C++中: 四、指针数组 五、 二级指针 六、...

  • C语言的指针与数组(进阶篇之一)

    一、一维数组与指针 (1).数组指针在C语言中,数组的首地址称为数组指针。而C++规定,数组的首地址可用数组名a表...

  • C语言中的指针与数组

    C语言中的指针与数组 @(C语言)[排序算法, 快速排序, C实现] 引言 相信指针与数组是不少同学在初学C语言时...

  • 02-C语言的指针

    02-C语言的指针 目标 C语言指针释义 指针用法 指针与数组 指针与函数的参数 二级指针 函数指针 指针在C中很...

  • 指针与数组的区别和联系

    原文地址:指针与数组的区别和联系作者:zhenhuaqin 一.指针与数组的联系: 指针与数组是C语言中很重要的两...

  • C语言杂谈:指针与数组 (下)

    思维导图 介绍 前接上文C 杂谈之 指针与数组 (一),接续往下谈指针和数组。 指针与数组 ——承接上文进行扩展 ...

网友评论

      本文标题:C程序设计语言04 - 指针与数组

      本文链接:https://www.haomeiwen.com/subject/qhbuzctx.html