首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

编程语言学习札记:C语言 (4) 指针

2012-09-01 
编程语言学习笔记:C语言 (4) 指针int x 1, y, z[4]int *p, *q/* 可以理解为指针p的值为int类型,p是指

编程语言学习笔记:C语言 (4) 指针
int x = 1, y, z[4];int *p, *q; /* 可以理解为指针p的值为int类型,p是指向int类型的指针 */p = &x; /* p指向x */y = *p; /* y赋值为1 */*p = 0; /* x赋值为0 */q = p; /* q指向x */p = &z[0]; /* p指向z[0] */x = *p++; /* x赋值为z[0],p指向z[1],注意*和++、--的组合用法 */?

?

需要注意,指针必须指向某种特定的数据类型。指针是变量,可以直接使用。指针的间接引用结果也相当于变量。

int a, b;swap(&a, &b);swap(int *pa, int *pb) {...} /* 对应的函数声明中使用指针作为参数 */?

?

char astring[] = "a string"; /* 定义一个字符数组 */char *pstring = "a string"; /* 定义一个字符指针 */?

?

上面两个定义中,字符数组中的字符可以修改,因为它是一个经过初始化的变量,而字符指针指向的是一个字符串常量,所以字符串不可以修改,可以修改指针本身。

char *weekday[8]; /* 声明字符串数组 */static char *weekday[] = { /* 声明并初始化一个静态字符串数组 */ "Illegal weekday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};?

?

#include <stdio.h>int main(int argc, char *argv[]){ int c, except = 0, number = 0, found = 0; while (--argc > 0 && (*++argv)[0] == '-') while (c = *++argv[0]) switch (c) { case 'x': except = 1; break; case 'n': number = 1; break; default: printf("find: illegal option %c\n", c); argc = 0; found = -1; break; } if (argc != 1) printf("Usage: find -x -n [pattern]\n"); else { /* ... */ } return found;}?

struct { int n; char *s;} *p;*p->s /* 读取s所指的对象的值 */*p->s++ /* 读取s所指的对象的值,然后将s加1(指向下一个字符) */(*p->s)++ /* 将s指向的对象的值加1 */*p++->s /* 读取s所指的对象的值,然后将p加1(指向下一个结构) */?

?

指向结构的指针的步进长度为结构的长度,这点和指向数组元素的指针类似。

int (*comp)(void *, void *)?

?

表示 char (*(*x())[])()/* x是返回指向一个指向返回char类型的函数的指针的数组的指针的函数 */char (*(*x[3])())[5]/* x是长度为3的,每个元素为指向返回指向长度为5的char类型数组的指针的函数的指针的数组 */?

处理这种复杂的声明时,可以对它们进行替代,使结构更清晰。

如上例中:

a = t1 *x()        /* x是返回指向t1类型的指针的函数:char (*a[])() */p = t2 a[]         /* a是t2类型的数组:char (*p)() */f = char (*p)()    /* p是指向返回char类型的函数的指针:f *//* x是返回指向((指向返回char类型的函数的指针)的数组)的指针的函数 */p = t1 x[3]        /* x是长度为3的t1类型的数组:char (*(*p)())[5] */a = t2 *(*p)()     /* p是指向返回指向t2类型的指针的函数的指针:char a[5] */b = char a[5]      /* a是长度为5的char类型数组:b *//* x是长度为3的(指向返回指向(长度为5的char类型数组)的指针的函数的指针)的数组 */
?

?

对于这种嵌套结构,可以使用 typedef 来定义新的数据类型,提高程序的可读性。

原文