C语言中指针变量和数组的组合

int a[10];
int * p;
C语言规定数组名代表数组中第一个元素(即序号为0的元素)的地址,因此,下面两个语句等价:

p = &a[0];
p = a;

 

摘自:C语言程序设计(第二版)p211
(5)指针变量的值是可以改变的,见下例。

例10.20 改变指针变量的值。

#include <stdio.h>
void main()
{
char *a = "I love China!":
a = a + 7;
printf("%s", a);
}

运行结果如下:

China!

指针变量a的值是可以变化的,输出字符串是地从a当时所指向的单元开始输出各个字符,起码到遇’\0’为止。而数组名虽然代表地址,但它是常量,它的值是不能改变的。下面的用法是错误的:

char str[] = {“I love China!”};
str = str + 7;
printf(“%s”, str);

需要说明,若定义了一个指针变量, 并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。

例10.21 用带下标的字符指针变量引用字符串中的字符:

#include <stdio.h>
void main()
{
char *a = "I love China!";
int i;
printf("The sixth character is %C\n", a[5] );
for(i=0; a[i] != '\0'; i++)
printf(%c" a[i]);

printf("\n");
}

运行结果如下:

The sixth character is e
I love China!

程序中虽然并未定义数组a,但字符串在内存中是以字符数组形式存放的。a[5] 按*(a+5)处理,即从a当前所指向的元素下移5个元素位置,取出其单元中的值。

用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。

例如:

char *format;
format = "a=%d,b=%f\n";
printf(format,a,b);

它相当于:

printf(“a=%d,b=%f\n”,a,b);

因此只要改变指针变量format所指向的字符串,就可以改变输入输出的格式。这种printf函数称为可变格式输出函数。也可以用数组实现。例如:

char format[]=”a=%d,b=%f\n”;
printf(format,a,b);

但由于不能采用赋值语句对数组整体赋值,例如:

char format[];
format = “a=%d,b=%d\n”;

因此,用指针变量指向字符串的方式更为方便。