关于C语言中的指针问题,无数次都感觉自己已经OK了,其实每一次碰见都感觉有陌生的地方,可能是个人对知识没有深入理解造成的。有预感这会是一个很长的系列:
最近在看Computer Systems: A Programer's Perspective,在强制类型转换中有一段代码,涉及到指针强转,数据类型定义,指针常量和常量指针,等较为混淆的概念:
#include<stdio.h>#include<string.h>
typedef unsigned char * byte_pointer;
void show_bytes(byte_pointer start, int len)
{
int i;
for(i = 0; i < len; i++)
{
printf(" %.2x",start[i]);
}
printf("\n");
}
void show_int(int x)
{
show_bytes((byte_pointer)&x,sizeof(x));
//取址运算符创建了一个指针,&x创建了一个指向保存变量x的位置指针。
//&x的指针类型为 int *
}void show_float(float x)
{
show_bytes((byte_pointer)&x, sizeof(x));
//&x的指针类型为 float *
}
void show_pointer(void *x)
{
show_bytes((byte_pointer)&x,sizeof(x));
//&x的指针类型为 float *
}void main()
{
char *str = "today";
const char *s = "abcdef";
char const *sconst = "ABCDEF";
char * const pcs = "free";
int val = 0x87654321;
float fval;
byte_pointer valp = (byte_pointer)&val;
s = str;
sconst = str;
*pcs = "abcd"; //something is wrong!
show_bytes((byte_pointer)str,strlen(str));
show_bytes((byte_pointer)s, strlen(str));
show_bytes((byte_pointer)sconst,strlen(sconst));
show_bytes((byte_pointer)pcs,strlen(pcs));
return;
}
typedef:数据类型命名,可以改善代码的可读性,深度嵌套的类型声明很难读懂。
typedef unsigned char * byte_pointer;
byte_pointer 等价于unsigned char *;