c语言函数指针访问成员 通过指针访问成员函数( 七 )


第九章 。指针的安全问题
看下面的例子:
例十七:
char s=’a’;
int *ptr;
ptr=(int*)s;
*ptr=1298;
指针ptr是一个int*类型的指针 , 它指向的类型是int 。它指向的地址就是s的首地址 。在32位程序中,s占一个字节,int类型占四个字节 。最后一条语句不但改变了s所占的一个字节,还把和s相临的高地址方向的三个字节也改变了 。这三个字节是干什么的?只有编译程序知道,而写程序的人是不太可能知道的 。也许这三个字节里存储了非常重要的数据,也许这三个字节里正好是程序的一条代码 , 而由于你对指针的马虎应用,这三个字节的值被改变了!这会造成崩溃性的错误 。
让我们再来看一例:
例十八:
1 。char a;
2 。int *ptr=a;
...
...
3 。ptr++;
4 。*ptr=115;
该例子完全可以通过编译,并能执行 。但是看到没有?第3句对指针ptr进行自加1运算后,ptr指向了和整形变量a相邻的高地址方向的一块存储区 。这块存储区里是什么?我们不知道 。有可能它是一个非常重要的数据,甚至可能是一条代码 。而第4句竟然往这片存储区里写入一个数据!这是严重的错误 。所以在使用指针时,程序员心里必须非常清楚:我的指针究竟指向了哪里 。
在用指针访问数组的时候,也要注意不要超出数组的低端和高端界限,否则也会造成类似的错误 。
在指针的强制类型转换:ptr1=(TYPE*)ptr2中,如果sizeof(ptr2的类型)大
于sizeof(ptr1的类型),那么在使用指针ptr1来访问ptr2所指向的存储区时是安全的 。如果sizeof(ptr2的类型)小于sizeof(ptr1的类型),那么在使用指针ptr1来访问ptr2所指向的存储区时是不安全的 。至于为什么,读者结合例十七来想一想,应该会明白的 。
如果对你有所帮助,请记得采纳最佳答案,谢谢
C语言问题:指向函数(B)的指针做结构体(A)的成员,而这个函数(B)的形参中有这个结构体(A)类型的.这个该怎...c的结构体与c++的结构体的区别
答:标准C中定义,C语言中的结构体内是不能声明函数的
C++结构体中可以有函数的声明,不过他们都是历史遗留下来的产物
现在,应该避免使用结构体,因为结构体都可以由类来代替
你应该问类与结构的区别,类中如果不声明成员的访问控制属性,那么该成员默认是私有成员的,但是在结构题中,如果不进行显示说明,则默认访问属性是公有的
1:语言的内存分配有哪几种.?
答:不太明白你要问什么,不过访问内存是有两种方式,一种是直接通过变量名来访问,一种是间接访问,通过指针来访问,至于你说的内存分配的方式,有静态分配内存,当然也有动态内存分配,这个应该是你问的把
2:指针函数 与 函数指针的 区别.?
答:看名字你也应该有一定的理解了把
对于指针函数,踏的重心在函数,指针是修饰函数的,可以这么理解,那么它的重心既然是函数,则表示是定义了一个函数,至于是什么样的函数呢,由于是由指针修饰的,你就可以联想到,这个函数的返回类型是指针类型的
至于函数指针,他的重心是指针,函数是修饰指针的,则表示他是定义一个指针,但怎么理解呢,这是个什么样的指针呢,与我们平常所定义的指针不同,我们平常所定义的指针,是指向一个变量的,但是他与众不同的是,他不是指向一个变量,他是指向一个函数,直接使用指针名即可使用这个函数
3:冒泡排序的缺点是什么.?
答:冒泡排序的缺点是,每次排序只能冒出一个,要么是最大的要么是最小的元素,也就是说,你的循环做一趟,你才找出来一个元素,对于有n个元素,进行排序,则要循环n-1趟,才可以排好序.他的算法时间复杂度是n-1

推荐阅读