5.1 指针与地址
指针是保存变量地址的变量。 ANSI C使用void*
(指向void的指针)代替 char*
作为通用指针的类型
运算符&是取地址运算符。
p = &c; // 把c的地址赋给p,p为指向c的指针。&只能取内存对象的地址,如变量与数组元素。
运算符*是间接寻址运算符。作用于指针时,将访问指针指向的对象。
int x = 1, y = 2, z[10];
int *ip; // ip为指向int型的指针
ip = &x; // ip指向x
y = *ip; // y的值为1
*ip = 0; // x的值为0
ip = &z[0]; //ip指向z[0]
int *ip;
该语句表明 *ip
为int型
double *dp, atof(char *);
该语句表明 *dp, atof(s)
为double型,且atof()
的参数是一个指向char的指针。
5.2 指针与函数参数
C语言是以传值的方式将参数值传递给被调用函数。要想被调函数直接修改主调函数中变量的值需要将变量的指针传递给被调函数。
void swap( int *px, int *py)
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}
swap(&a,&b);
5.3 指针与数组
声明int a[10]
定义一个长度为10的数组a。声明int *pa
定义一个指向整型的指针。
pa = &a[0]; //将指针pa指向数组a的第0个元素,也就是说pa的值为a[0]的地址
/* 以上赋值语句可用另一种方式表示:*/
pa = a;
/* 这也说明a[i]可表示为*(pa+i)或*(a+i) */
a[i] == *(a+i) == *(pa+i) == pa[i];
/* 这也说明&a[i]等同于(a+i) */
&a[i] == a+i
*(pa+i)
意味着引用数组中第i个元素的值。pa + i
指向pa所指向对象之后的第i个对象。
注意:
- 指针是一个变量,
pa=a
,pa++
是合法的。数组名不是变量,a=pa
,a++
不合法。 - 数组名作为传递参数时,实际上是传递该数组第一个元素的地址。此时被调函数中该参数为指针,因为只有指针存地址。
- 在函数定义中
char s[ ]
和char *s
是等价的
5.5字符指针和函数
字符串常量是一个字符数组,例如:
"I am a string."
char amessage[] = 'now is the time.' //定义一个数组
char *pmessage = 'now is the time.' //定义一个指针
*t++ == *(t++)的值是执行自增运算前t所指向的字符
*--p == *(--p)在读取p指向的字符前先对p进行自减
5.6 指针数组& 指向指针的指针
指针数组
例子: char *a[10];
表示a是一个10个元素的一位数组,数组的每个元素都是指向字符类型的指针。也就是说a[i]
是一个字符指针, *a[i]
指向一个字符对象。
指针数组最频繁的用处是存放不同长度的字符串
例如:
static char *name[] = {
"Illegal month",
"January", "Feburary, "March"
};
5.7 多维数组
/* 三者等价*/
int daytab[i][j];
int daytab[][j];
int (*daytab)[j];
/* 指针数组*/
int *daytab[j];