指针的学习
针一直是学习C/C++语言的一个重点与难点。只有熟练地掌握了指针,才可以说掌握了C语言,c语言的最吸引人的地方也是指针,因为它可以任意地操作内存,编写程序中有着极大地自由空间,因此,也有人说指针是C语言的灵魂。而且指针也是程序员的必考内容。现我将自己所学的关于指针的知识进行了总结
1.指针事实上是一种数据类型,和int 基本类型一样。指针也是一种变量,占有内存空间,保存的是内存地址。
2.关于*p操作
(1)在声明指针中,“*”号表示所声明的变量是一个指针。
(2) 在指针使用时,“*”号表示操作指针所指向的内存空间中的值。
(3)当*p放在等号的左边时,相当于给内存赋值。
(4)当*p放在等号的右边时,相当于从内存中获取值。
view plain copy
<span style="font-size:18px;">int *p = NULL;//声明p是一个指针变量
int i = 3,j = 0;
p = &i;//p指向i所在内存
*p = 5;////将p所指的内存的值改变为5,此时变量i的值也是5
j = *p;//将*p把指的内存空间的值(i的值)赋值给j</span>
注:指针变量和它所指向的内存块是两个不同的概念。
3.指针的数据类型是指它所指向的内存空间的数据类型。当指针步长自加的时候,是根据所指向的内存的数据类型来确定的。
若在32位的系统上,一个指向整型数据的指针,自加的话,是加4.
view plain copy
int *p = &I;
p ++;//<==>(unsigned int)p+sizeof(int);
4.通过指针来改变变量的值是指针的一个重要应用。这是指针作为函数参数的精华。函数调用时,用n指针(形参)改变n-1指针(实参)的值。如:1级指针形参改变0级指针实参的例子。
view plain copy
Swap(int*a,int *b)
{
Int p = *a;
*a = *b;
*b = p;
}//这样可以将实参的值也改变。
5.数组作函数参数的时候会退化为一个指针
view plain copy
void fun(int a[10])<<==>>void
fun(int *a)//无论实参是包含多少个元素的数组,但作为函数参数只是把函数首地址传递给形参。
6.关于解决野指针的方案
(1)定义指针时,把指针变量赋值为null;
(2)释放内存时,先判断指针变量是否为null;
(3)释放内存完毕后,把指针变量重新赋值为null
指针代码编写
用动态数组编程输入任意m个班学生(每班n个学生)的某门课的成绩,计算最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。其中,m和n的值由用户从键盘任意输入(不限定m和n的上限值)。