本文目录一览:
c语言指针嵌套问题
int **p=a
这个是把int *型赋值给int **型。 本身类型就不匹配。
然后 *p=a 相当于把数组a的首地址 赋值给*p 也就是a[0]
这个等效于 把a的首地址 赋值给了a的第一个元素。即 a[0] = (int )a;
之后输出**p = a[0] 这里会输出a的首地址值。
至于后续的 *p=b 输出*p值会是2.
c语言中函数指针作为参数与函数的嵌套
您好,针对这个问题
Status
InOrderTraverse(BiTree
T
,Status(*Visit)(TElemType
e))函数中第2个参数是一个指向函数的指针,这样做的目的是为了程序的灵活性。试想如果给你一个整型数100,要求分别按照10进行、16进制输出,你可以写一个输出10进制函数与输出16进制函数,当你有需要输出16进制时,只需要将16进制函数地址传给Visit就行,而不需要改变InOrderTraverse函数,这种做法灵活,也符合软件工程编程思想。
另外,InitStack(S);
就是函数调用,这种就在InOrderTraverse已经写死了,如果有几种初始化情况的话,就得在InOrderTraverse增加判断条件来加以区分,这样增加了代码量。
希望我的回答对您帮助!
C语言如何对位操作?有哪些方法 对多于一层的指针嵌套 如何处理
不知道你是不是指我下面说的意思~~
有两种方法:
第一,使用位操作:举例来说吧,
int main()
{
int i;
unsigned char iTest[16];//定义这16个字节
//printf("%d\n",sizeof(unsigned char));//验证unsigned char为单字节
memset(iTest,0,16);//初始化所有位所有字节为0
for(i=0;i16;i++)//写点测试数据
{
iTest[i] = 1(i 7);//将第i个字节(从0起计)的第(i%8)位上赋为1
//printf("%X\n",iTest[i]);//检验一下结果
}
//现在假设要更改第3个字节第5位的值
printf("%X\n",iTest[2]);//先检验一下现在的值,应该为0000 0100
iTest[2] ^= 0x20;//即与0010 0000做异或运算
printf("%X\n",iTest[2]);//检验更改的结果,应该为0010 0100
//除了取反外,还有置0和置1
printf("%X\n",iTest[3]);
iTest[3] = 0xf7;//即将iTest[3]的第3位置0,结果为0000 0000
printf("%X\n",iTest[3]);
iTest[3] |= 0x08;
printf("%X\n",iTest[3]);
//如果需要一次操作好几位,比如要使第11个字节的0-4位取反
printf("%X\n",iTest[11]);//当前是0000 1000
iTest[11] ^= 0x1f;//即与0001 1111做异或运算
printf("%X\n",iTest[11]);//结果应该是0001 0111
}
关于以上提及的取反,置0,置1的操作可以封装成宏,具体方法参见以下参考资料~~
第二,利用C的位域结构
struct Test
//将1个Byte用这个结构体表示
{
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:1;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
}BTest[16];
//之后无论进行单位操作,还是多位操作都可以直接以BTest[0].b0~=(=,|=,^=)这样的形式来完成。
这个就不用写例子了吧~~
参考下面这篇文章吧,虽然讲的是单片机上的C应用~_~