一元运算符&用于取一个对象的地址
p = &c
将C的地址赋值给变量p,我们称p为“指向”c的指针。
一元运算符是间接寻址或间接引用运算符运算符。当他作用于指针时,将访问指针所指向的对象。
(ps:这才是正确的,不是其他书上的是表示指针什么的,而是间接寻址的作用在指针上的体现是访问指针所指向的对象,即取该地址的值)
综上,&是用来改地址的,*是用来取值的
int x = 1, y = 2, z[10];
int *ip; /* ip为int类型指针 */
ip = &x; /* ip指向了x的地址 */ !先使用了x的地址! 之后才赋值整数,而“直接赋值整数是不行的”
y = *ip; /* 因为ip指向了x的地址,所以*取了x地址的值,即1 */
*ip = 0; /* *ip:ip的地址的值赋值为0,同时是x的地址,所以x=0 */ !指针不能赋值整数!
ip = &z[0]; /* ip此时指向了z[0]的地址 */
地址在那里,是不会变的。但是指针指向哪里,是可选的。
语句(*ip)++中的圆括号是必需的,否则,该表达式将对ip进行加1运算,而不是对ip指向的对象进行加1运算,这是因为,类似于 星号和++这样的一元运算符遵循从右到左的结合顺序。
因为指针也是变量,所以可以直接使用,不需要再次间接引用(*)
iq = ip
一个练习
#include<stdio.h>
main()
{
char s[20] = "abcdefGHI"; //长度为20的字符串,"{}"则是数组的标记
char*p = "1234567";
printf("%s\n",s + 2); //从字符串第[2]开始至结束,cdefGHI
printf("%s\n", &s[2]); //&取地址,取s的地址,再取其[2]开始,所以是至结束cdefGHI。且
printf("%c\n",s[2]); //结果:c。因为取的是%c,取字符串的[2]位
printf("%s\n",p + 5); //67,从指针的[6]开始,取到末尾
printf("%s\n",strcat(s + 3, p + 4));//字符串连接函数,返回值为s+3的地址,如果换为s+4,不影响连接,影响输出结果。从s[3]开始到末尾接上 p[4],为:defGHI567
printf("%d\n",strlen(p + 2));//有效字符个数,不包括\0,为:5
printf("%s\n",strcpy(p + 3,s + 9));//从p+3地址开始被s+9到\0替换 为空
printf("%s\n",s); //abcdefGHI
scanf("%s",s + 3);/*输入:ABC DEF<回车 >*/ //scanf遇到空格和回车都会停止读入,所以最终制度入ABC,若需要空格则选用Gets()函数
printf("%s",s); //由上可知为:abcABC
}