c语言函数指针的指针 c语言函数指针的指针是什么( 五 )


员时,在某种编译环境下 , 可能会需要字对齐或双字对齐或者是别的什么对齐 , 需要在相邻两个成员之间加若干个“填充字节” , 这就导致各
个成员之间可能会有若干个字节的空隙 。
所以,在例十二中,即使*pstr访问到了结构对象ss的第一个成员变量a,也不能保证*(pstr+1)就一定能访问到结构成员b 。因为成员a和成员b
之间可能会有若干填充字节,说不定*(pstr+1)就正好访问到了这些填充字节呢 。这也证明了指针的灵活性 。要是你的目的就是想看看各个结构
成员之间到底有没有填充字节,嘿,这倒是个不错的方法 。
通过指针访问结构成员的正确方法应该是象例十二中使用指针ptr的方法 。
第七章 。指针和函数的关系
可以把一个指针声明成为一个指向函数的指针 。
int fun1(char*,int);
int (*pfun1)(char*,int);
pfun1=fun1;
....
....
int a=(*pfun1)("abcdefg",7);//通过函数指针调用函数 。
可以把指针作为函数的形参 。在函数调用语句中,可以用指针表达式来作为实参 。
例十三:
int fun(char*);
int a;
char str[]="abcdefghijklmn";
a=fun(str);
...
...
int fun(char*s)
{
int num=0;
for(int i=0;i strlen(s);i++)
{
num+=*s;s++;
}
return num;
}
这个例子中的函数fun统计一个字符串中各个字符的ASCII码值之和 。前面说了 , 数组的名字也是一个指针 。在函数调用中,当把str作为实参传
递给形参s后,实际是把str的值传递给了s,s所指向的地址就和str所指向的地址一致 , 但是str和s各自占用各自的存储空间 。在函数体内对s
进行自加1运算,并不意味着同时对str进行了自加1运算 。
第八章 。指针类型转换
当我们初始化一个指针或给一个指针赋值时 , 赋值号的左边是一个指针,赋值号的右边是一个指针表达式 。在我们前面所举的例子中,绝大多
数情况下 , 指针的类型和指针表达式的类型是一样的,指针所指向的类型和指针表达式所指向的类型是一样的 。
例十四:
1 。float f=12.3;
2 。float *fptr=f;
3 。int *p;
在上面的例子中,假如我们想让指针p指向实数f,应该怎么搞?是用下面的语句吗?
p=f;
不对 。因为指针p的类型是int*,它指向的类型是int 。表达式f的结果是一个指针,指针的类型是float*,它指向的类型是 float 。两者不一致
 , 直接赋值的方法是不行的 。至少在我的MSVC++6.0上,对指针的赋值语句要求赋值号两边的类型一致 , 所指向的类型也一致,其它的编译器上
我没试过,大家可以试试 。为了实现我们的目的 , 需要进行“强制类型转换”:
p=(int*)f;
如果有一个指针p,我们需要把它的类型和所指向的类型改为TYEP*和TYPE,那么语法格式是:
(TYPE*)p;
这样强制类型转换的结果是一个新指针 , 该新指针的类型是TYPE*,它指向的类型是TYPE,它指向的地址就是原指针指向的地址 。而原来的指针
p的一切属性都没有被修改 。
一个函数如果使用了指针作为形参,那么在函数调用语句的实参和形参的结合过程中,也会发生指针类型的转换 。
例十五:
void fun(char*);
int a=125,b;
fun((char*)a);
...
...
void fun(char*s)
{
char c;
c=*(s+3);*(s+3)=*(s+0);*(s+0)=c;
c=*(s+2);*(s+2)=*(s+1);*(s+1)=c;
}
注意这是一个32位程序,故int类型占了四个字节,char类型占一个字节 。函数fun的作用是把一个整数的四个字节的顺序来个颠倒 。注意到了

推荐阅读