1)、先取*p值,后使p值加1:*p++与*(p++)等价。(++和*同优先级,结合方向自右而左)
2)、先使p值加1,后取*p值:*(++p)
1、用数组名做函数参数
C编译时将形参数组名作为指针变量来处理的,所以以下2个函数的定义是等价的:
f( int arr[] , int n )
f( int *arr , int n )
2、多维数组与指针
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
或
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
a 代表首行(第0行)的首地址,即&a[0][0];a+1代表第1行的首地址;
a[0] 代表首行(第0行)的首地址,即&a[0][0];a[0]+1代表第0行第1列的元素的地址;
a[1]和*(a+1)等价(&a[1][0]);a[1]+1=*(a+1)+1=&a[1][1]
<span style="font-size:14px;"><span style="font-size:14px;">#include<stdio.h>
void main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p;
for(p=a[0];p<a[0]+12;p++)
{
if((p-a[0])%4==0)
printf("\n");
printf("%4d",*p);
}
printf("\n");
}</span></span>
3、字符串 与 指针
1)、在C中,字符串是被当做字符数组来处理的。
字符串结束标志:'\0' (ASCII值为0,即空操作字符NUL)
int a[10]={0,1,2,3,4,5,6,7,8,9};
char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};
与
char c[ ]={"I am happy"}; 或 char c[ ]="I am happy";
都是定义字符数组,但是前者数组长度是10,后者长度是11(因为字符串常量的最后由系统加上了一个'\0');
即
char c[ ]={"I am happy"}; 或 char c[ ]="I am happy";
与
char c[10]={'I',' ','a','m',' ','h','a','p','p','y','\0'};等价。
为了使处理方法一致,在字符数组中常常人为地加上一个'\0'。这样做,便于引用字符数组中的字符串。
例如:
char c[]="Pascal program";
若想用一个新的字符串代替原有的字符串,从键盘向字符数组输入:Hello
如果不加'\0'的话,字符数组中的字符如下:
Hellol program
2)、字符数组的输入输出
两种方法:
1)、%c:逐个字符输入输出
2)、%s:整个字符串
例:
char c[]="China";
printf("%s",c); //注意输出项是字符数组名
输入字符串时,系统把空格字符作为输入的字符串之间的间隔符。
例:
char str[13];
scanf("%s",str);
如果输入以下12个字符:
How are you?
只有how和\0被保存到str中。
·3)
访问一个字符串的方式有2种:
(1)、字符数组存放一个字符串
char str[]="I love China!";
对字符数组智能对各个元素赋值,不能用以下办法对字符数组赋值:
char str[14];
str="I love China!";
即数组可以在定义时整体赋初值,但不能在赋值语句中整体赋值。
(2)、用字符指针指向一个字符串
char *str="I love China!"; (实质是把字符串第一个元素的地址赋给str,不要误以为把字符串赋给str)
与
char *str;
str="I love China!" (特别注意不是*str !! 因为实质赋值的是地址)
等价;
2)、字符指针作函数形式参数
1、字符数组作函数形参
char a[]="I am a boy";
char b[]="You are a engineer";
char *c=a;
char *d=b;
void function ( char from[] , char to[] )
a、字符数组作实参
function(a,b);
b、字符指针变量作实参
function(c,d)
2、字符指针变量做函数形参
char a[]="I am a boy";
char b[]="You are a engineer";
char *c=a;
char *d=b;
void function( char *from, char *to);
调用:
function(c,d);
注意:
1、指针变量的值是可以改变的,而数组名虽然代表地址,但它是常量,它的值是不能改变的;
void main()
{
char *a="I love China!"
a=a+7;
printf("%s",a)
}
输出结果:China!
而以下是错误的:
char a[]="I love China!";
a=a+7;
printf("%s",a);
2、避免不可预料的情况。
char str[10];
scanf("%s",str);
是可以的,但是下面的是危险的:
char *str;
scanf("%s",str);
因为&str虽然分配了,但是str的值是不可预料的,随意改变可能破坏系统。
可以这样做:
char *a, str[10];
a=str;
scanf("%s",a);