通俗的将指针就是地址,指针变量就是存储地址的变量。
一个简单的指针变量的声明:
int *p;上述声明p是指向int类型对象的指针变量。
一、取地址运算符:
声明指针变量是为指针留出空间,但是并没有把它指向对象:
int *p;在使用前初始化p至关重要。
一种初始化指针变量的方法是使用&运算符把某个变量的地址赋给它。
int i,*p;
p=&i;通过把i的地址赋值给变量p的方法,描述为把p指向i;
Q&A:在声明指针变量的同时对它进行初始化也是可行的:
int i;
int *p=&i;
或者
int i,*p=&i;二、间接寻址运算符
一旦指针变量指向对象,就可以使用*运算符访问存储在对象中的内容。例如p指向i,那么可以写出显示i的值:
printf("%d\n",*p);Q&A:printf函数显示i的值,而不是i的地址。
只要p指向i,*p就是i的别名。*p不仅拥有和i相同的值,而且对*p的改变也会改变i值。(*p是左值,随意对它赋值是合法的)。
不要把间接寻址运算符用于位初始化的指针变量。
三、指针赋值
C语言允许使用赋值运算符进行指针的复制,前提是两个指针具有相同的类型:
int i,j,*p,*q;
p=&i;//把i的地址复制给p
q=p;//把p的内容(i的地址)复制给q,效果是把q指向了p所指向的地方注意不要把
q=p;
*q=*p;这两个搞混了。第一条指针赋值,而第二条不是,举个例子:
p=&i;
q=&j;
i=1;
*q=*p;赋值语句*q=*p是把p指向的值复制到q指向的对象(变量j)中。
四、指针的运算
int a[10],*p,*q,i;
p=&a[2];
q=p+3;
p+=6;五、用数组名作为指针
用数组名作为指向数组第一个元素的指针。
int a[10];
*a=9;//等价于a[0]=9;
*(a+1)=12;//等价a[1]=12;
数组名可用指针这一事实使得编写遍历数组的循环更容易。
六、自家封装的一个连接字符串函数
char *concat(const char *s1,const char *s2)
{
char *result;
result = malloc(strlen(s1)+strlen(s2)+1);
if (result == NULL)
exit(EXIT_FAILURE);
strcpy(result,s1);
strcat(result,s2);
return result;
}注意,函数空间的释放;