C++课程上 有关“指针” 的小结
上完了C++的第二节课以后,觉得应该对这个内容进行一个小结,巩固知识点,并对我的心情进行了一个侧面烘托...
开始上课的老师:
正在上课的我:
上去敲代码的我:
过程是这样的:
下来的我:
非常的尴尬,简直是黑历史= =
变量:
变量有整形变量,浮点型变量,字符型变量,当然还有指针变量。对于32位操作系统而言,为字符型变量分配的内存单元是一个字节,整型是两个字节,单精度浮点型变量为四个,双精度浮点型变量为八个字节,今天要阐述的指针变量是四个字节。
指针变量所存储的是地址。
int a;
int *pa;
pa = &a; //将整形变量a的地址赋值给整型指针pa
经过上面代码的处理以后,指针pa指向变量a。
指针变量的定义:
int *ptr1;
float *ptr2;
char *ptr3;
void *ptr;
指针变量的赋值:
int *ptr,a = 4;
ptr = &a; //将变量a的地址赋值给指针变量ptr
经过上面语句的处理以后,整形指针指向整形变量a。原来以为整形指针和整形变量放在一起定义编译会出错,学习了:int *ptr,a=4;
指针变量的引用:
(1)
int main()
{
int *p,m;
scanf("%d",&m);
p = &m; //指针p指向m
printf("%d\n",*p);
return 0;
}
这段程序比较简单,没有什么问题。
(2)
int main()
{
int *p,m;
p = &m;
scanf("%d",p);
printf("%d\n",m);
return 0;
}
我:“???”
回来以后自己试了下,弄懂了这个内容,就是把之前输入的scanf中的&m
替换为p。这里摘取一段C++中文网介绍scanf的说明。
例如:&a、&b分别表示变量a和变量b的地址。
这个地址就是编译系统在内存中给a、b变量分配的地址。在C语言中,使用了地址这个概念,这是与其它语言不同的。 应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。
(3)
int main()
{
int *p,m;
scanf("%d",p);
p = &m;
printf("%d\n",m);
return 0;
}
“这不行吧???”
确实是不行的,程序崩溃。原因是因为其不安全性。
指针:
指针是一种特殊的变量,它存储的数值是内存中的一个地址。
1.指针的类型
2.指针所指向的类型
3.指针的值 或者 指针所指向的内存区
4.指针本身所占据的内存区
指针的类型和指针所指向的类型:
1.指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。
2.只需把指针声明语句里的指针名字和名字左边的指针声明符*去掉,剩下的部分就是这个指针所指向的类型。
int *ptr; //整形 指针
char *ptr; //字符型 指针
int* *ptr; //整形指针 的 指针
int (*ptr)[3]; //指向含三个整形元素的整形数组 的 指针
int* (*ptr)[4]; //指向含四个整形指针的指针数组(array of pointers) 的 指针
这里注意“数组 指针”(a pointer to an array)和“指针 数组”(array of pointers)的区别,参考资料:指针数组和数组指针的区别
void 指针
int main()
{
int m = 5;
void *ptr;
ptr = &m;
printf("%d\n",*ptr);
return 0;
}
编译错误。
“void型指针,表示这个指针指向的内存中的数据的类型要由用户来指定。
比如内存分配函数malloc函数返回的指针就是void *型,用户在使用这个指针的时候,要进行强制类型转换,也就是显式说明该指针指向的内存中是存放的什么类型的数据
(int *)malloc(1024)表示强制规定malloc返回的void*指针指向的内存中存放的是一个个的int型数据。”
指针的值:指针所指向的内存区。
指针本身所占据的内存区:
可以使用sizeof(指针类型),对于32位操作系统来说,系统为指针变量分配4个字节的长度。
char *np;
1. sizeof(char) // 1
2. sizeof(*np) //4
3. sizeof(char *) //4
4. sizeof(char *p) //compiling error
To improve is to change, to be perfect is to change often.