四.指针的一些运算
1.指针与整型量相加减
首先说一下,指针加(减)整型量,其结果依然是指针,且指针类型不变。
p + 1的结果是:指向 p 所指向的空间的下一个指类元素空间。
p 的值与 p + 1的值,差值的 绝对值 是sizeof ( p 的指类 )…sizeof(char)诸如此类。
#include<stdio.h>
int main(){
int a[] = {1,2,3,4};
int *b = &a[0];
printf(" a[0]的首地址为%p\n a[1]的首地址为%p\n a[2]的首地址为%p\n ",&a[0],&a[1],&a[2]);
printf(" b的值为%p\n b+1的值为%p\n", b , b+1);
return 0;
}
跑代码结果如下
int类型为4B,所以指针运算b+1,指向的移动距离是4B。
接下来我们再试一试double类型,由于指针类型与数组被定义类型不同,这里运行代码出现了警告,没关系,只是为了验证p + 1的结果是:指向 p 所指向的空间的下一个指类元素空间。
double *c = &a[0];
printf(" c的值为%p\n c+1的值为%p\n", c , c+1);
2.指针与指针相减
指针与之指针相减,其结果的绝对值是两个指针所指向的空间的指类元素个数。 因此,两个相减的指针的指类必须保持一致。
#include<stdio.h>
int main(){
int a[] = {3,2,3,5};
int *b = &a[0];
int *c = &a[3];
printf("%d %d",b-c,c-b);
return 0;
}
3.指针与指针相加是语法错误
五.指针与数组
1.数组名称是常量(所以不可以被赋值)。
2.数组名称的本质是该数组的首地址常量(指针常量)。所以,数组名称可以做指针的所有操作
3.由于字符串是多个字符,需要多个存储空间,通常用字符数组。首先定义字符数组。
呐
#include<stdio.h>
int main(void)
{
char s[70]="Guo xiaoying is a good girl!";
char *p=s;
p="cute";
//这是一个指针应用错误示范。仅仅改变p指针的指向,对与数组 s中的内容未更改。
printf("%s\n",s);
p=s+18;
*(p+0)='c';
*(p+1)='u';
p[2]='t';
p[3]='e';
printf("%s\n",s);
return 0;
}
得证,数组名称是指针
即*(a+i)<=> a[i]