这几天在学习数据结构,需要大量用到指针,由于C语言还是两年前学的,所以对指针的定义还不够明确,于是在网上搜了一下指针加星号和不加星号的区别,总结如下:
1、星号不是指针名称的一部分,加星号只是说明这是一个指针的变量,但是为什么不用形如 Pointer p;
这样的方式定义指针呢?因为这样的话p指针所指向的数据类型不够明确,所以用如 int *p;
这样的方式定义指针才是最科学的;
2、函数声明和调用的时候需要用到指针,比如有个函数max(int *a,int *b);
我们在定义这个函数和和声明这个函数的时候就需要加星号;
3、取指针变量的值的时候需要用到指针,形如printf("%d的地址是%d", *p, p);
第一次输出的是指针p指向的数据值,第二次输出的是存放这个数据的地址。
4、结构体类型中,当p指向一个结构体类型的变量时,如果要取这个结构体的成员值,则使用(*p).成员名
,如(*p).age;
当然也有一种写法是p->age
,这两种方式是等价的。
除此之外,指针不需要加星号,比如
int *p, a;
a = 5;
p = &a;
意思是p指向变量a的地址,此时*p=5;
Update(2013年10月19日):
*
可以说是&
的逆向运算符,&
是取地址符号,而*
可是说是取值符号,上次老师讲得时候我还是有点弄不明白,看来该好好看书了。
UPDATE:
在主函数里面不能只定义指针变量而不定义一个实际的变量,在需要用到指针变量的时候,指针需要有指定的变量,因为指针指示一个地址!比如:
void main()
{
int i=0;
SString S;
char cstr[]="i miss Miss C.";
printf("%c",cstr[2]);
for(i=0; cstr[i]!='\0'; i++) {
S.str[i]=cstr[i];
}
S.len=i;
}
在这个main函数里面我开始是SString *S
,然后用指针S进行运算,最后VC不报错,但是运行的时候就出现提示运行停止这样的错误。改成上面这样的直接SString型的变量就可以了