指针
指针的声明
下面的三条语句是等价的,但是我们常常使用的是第一种形式int *p,同时我们注意,他们是在初始化p而不是*p。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=12;
int *p1=&a;
int* p2=&a;
int * p3=&a;
printf("p1: %p %d\n",p1,*p1);
printf("p2: %p %d\n",p2,*p2);
printf("p3: %p %d\n",p3,*p3);
return 0;
}
/*
p1: 0028FF10 12
p2: 0028FF10 12
p3: 0028FF10 12
*/
指向void 类型的指针可以指向其他的任何的数据类型变量的地址。任何类型的指针也可以指向void.
int main()
{
int a=12;
double b=12.99;
void *p=&a;
printf("%d\n",*((int *)p));
p=&b;
printf("%lf\n",*((double *)p));
return 0;
}
/*
12
12.990000
*/
我们可以在变量value前使用&但是不能在value ‘计算符’ ‘常量或变量’前加&,因为value ‘计算符’ ‘常量或变量’得到的是常量
int a=12,b=10;
int *p=&(a+b); // error: lvalue required as unary '&' operand
数组和指针
数组名是一个指针常量,数组定义时设置成数组第一个单元的地址,从此以后就不能修改,int a[3]; a=...
是错误的。
但是修改数组的单元是合法的,a[1]=...
。
指针变量可以进行赋值操作。
#include <stdio.h>
int main(){
char *p=NULL;
char s[10]="123456789";
p=s;
printf("%s\n",p);
p=s+2; /* 等价于 p=&s[2]; [2]表示和数组首地址的偏移量是2 */
printf("%s\n",p);
p=s+4; /* 等价于p=&s[4]; [4]表示和数组首地址的偏移量是4 */
printf("%s\n",p);
return 0;
}
/*123456789345678956789*/