指针常量

指针常量是指针所指向的位置不能改变,即指针本身是一个常量。但是指针常量可以通过间接引用修改内存中的数据。
例如:  int a=5,b=7;
int *const p=&a;
*p=b;(正确)//指针常量指向的内容可以修改
p=&b(错误)//指针常量是指针所指向的位置不能改变
定义指针常量的语句格式为:
指针类型 *const 指针常量名=&变量名;

指针名称前什么时候需要加星号+指针学习总结

这几天在学习数据结构,需要大量用到指针,由于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;
}

sstringbug

在这个main函数里面我开始是SString *S,然后用指针S进行运算,最后VC不报错,但是运行的时候就出现提示运行停止这样的错误。改成上面这样的直接SString型的变量就可以了

C语言里->和点号.的区别

这两个符号都是用来取结构体成员的值的。

如果使用->,那前面一定是指针,比如p->age这样就说明p是一个指针,当然(*p).age和p->是等价的。

如果使用.符号,那前面可能是指针,也可能就是结构体变量的名称,因为结构体变量只能用点符号,而指针两种符号都可以用

今天学习struct遇到了问题

开始是源于这样一个问题,从键盘输入十个同学的成绩,然后求出这是个成绩的平均值,最大值,最小值,要求使用调用函数的方式。

例题后面的答案是使用调用的函数return平均值,然后最大值和最小值使用全局变量,但是书上又说尽量不要使用全局变量,所以我想用别的办法让这个自己写的函数直接可以返回平均值、最大值、和最小值,于是想到了用这个函数返回数组或者定义一个结构体,结构体包含上面这个变量,然后返回到main函数。

 

可是关键字是,C语言可以返回结构体或者数组类型的变量吗?

 

UPDATE:

经过一段时间的学习,才知道这是可以的,实现返回需要的数据类型的变量的时候,按如下格式定义你的函数:

DataType  FuncName( 形参列表 )

{

somecode;

return (DataType类型的变量);

}

特别注意的是如果需要返回指针的时候,需要将FuncName前面加一个*号,说明这是一个指针。