指针是一种保存变量地址的变量。C语言中,指针的使用非常广泛,原因之一是,指针常常是表达某个计算的惟一途径,另一个原因是,同其它方法比较起来,使用指针通常可以生成更高效、更紧凑的代码。
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]
(*ip)++,中的圆括号是必需的,否则,该表达式将对ip进行加1 运算,而不是对ip指向的对象进行加1运算。
指针也是变量,所以在程序中可以直接使用,而不必通过间接引用的方法使用。
指针参数使得被调用函数能够访问和修改主调函数中对象的值。(针对变量名称,其为指针还是类型?)
void swap(int *px, int *py)
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}
在 C 语言中,指针和数组之间的关系十分密切,因此,在接下来的部分中,我们将同时讨论指针与数组。通过数组下标所能完成的任何操作都可以通过指针来实现。一般来说,用指针编写的程序比用数组下标编写的程序执行速度快,但另一方面,用指针实现的程序理解起来稍微困难一些。
数组声明:
int a[10];
int *pa;
pa = &a[0]; //pa指向数组a的第0个元素,pa的值为a[0]的地址
pa = &a[0];
pa = a;
a[i]等同于*(a+i),在计算数组元素a[i]的值时,C 语言实际上先将其转换为*(a+i)的形式,然后再进行求值。简而言之,一个通过数组和下标实现的表达式可等价地通过指针和偏移量实现。
数组名和指针之间有一个不同之处,指针是一个变量,因此,在C语言中,语句pa=a和pa++都是合法的。但数组名不是变量,因此,类似于a=pa和a++形式的语句是非法的。但是在函数参数中,相当于将数组的第一个地址赋予了函数的形参,并非是数组名的自增,所以是可以传递数组名的。
字符串常量是一个字符数组。
”I am a string“
字符串常量占据的存储单元数也因此比双引号内的字符数大1。
printf("Hello, world\n");
char *pmessage;
pmessage = "now is the time"; //都是指针使用
char amessage[] = "nw is the time"; /* 定义一个数组*/
char *pmessage = "now is the time"; /* 定义一个指针*/
void strcpy(char *s, char *t) //将t拷贝到s中
{
while (*s++ = *t++)
;
}
*p++ = val; //将val压入栈
val = *--p; //将栈顶元素弹出到val中
由于指针本身也是变量,所以它们也可以像其它变量一样存储在数组中。
char *lineptr[MAXLINES];
static char *name[] = {
"Illegal month",
"January", "February", "March",
"April", "May", "June",
"July", "August", "September",
"October", "November", "December"
};
C语言提供了类似于矩阵的多维数组,但实际上它们并不像指针数组使用得那样广泛。
static char daytab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
f(int (*daytab)[13]); //二维数组,表明参数是一个指针,它指向具有13个整型元素的一维数组
int *daytab[13]; //一维指针数组
int a[10][20];
int *b[10];
指针数组的一个重要优点在于,数组的每一行长度可以不同。而多维数组可以理解为每行固定长度的指针。
在支持C 语言的环境中,可以在程序开始执行时将命令行参数传递给程序。调用主函数main 时,它带有两个参数。第一个参数(习惯上称为argc,用于参数计数)的值表示运行程序时命令行中参数的数目;第二个参数(称为argv,用于参数向量)是一个指向字符串数组的指针,其中每个字符串对应一个参数。我们通常用多级指针处理这些字符串。
C语言程序有一个公共的约定:以负号开头的参数表示一个可选标志或参数。
在系统中调用运行的程序:
find -x -n
find -xn // 组合使用
在 C 语言中,函数本身不是变量,但可以定义指向函数的指针。
int (*comp)(void *, void *); //函数指针
int *comp(void *, void *); //返回指针的函数
int *f(); //f是一个函数,它返回一个指向int类型的指针
int (*pf)(); //pf:是一个指向函数的指针,该函数返回一个int类型的对象
如何创建复杂声明?