A. 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;i<16;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应用~_~
http://www.avrw.com/article/art_105_1721.htm
B. C语言结构体指针问题
结构体里边的ElemType Elem_array[MAX_SIZE];是数组,只要定义结构体他的空间就固定了,
想动态分配的话你得定义指针ElemType *Elem_array;
C. 关于C语言结构体指针问题
char
*
name
是一个指针,变量name存放的一个指向字符串的首地址。
你memset之后。name变为零了。也就是说,是一个无效的指针。
对于不同的编译器和执行环境来说,有的会报错,有的则是什么也不输出。或者输出其它的错误信息。
D. C语言结构的嵌套指针如何使用
题目不清晰,是以下意思吗?
structe student {
long stdno;
char *stdname;
float stdscore[3];
}
E. c语言中,循环,结构体,指针的问题
#include"stdio.h"
void main()
{
int n=0,i;
int b[3];
int result[100];
for(b[0]=1;b[0]<=4;b[0]++)
for(b[1]=1;b[1]<=4 ;b[1]++)
for(b[2]=1;b[2]<=4 ;b[2]++)
if(b[0]!=b[1]&&b[1]!=b[2]&&b[0]!=b[2])//如果无重复数字则记录
{
result[n]=b[0]*100+b[1]*10+b[2];
n++;
}
printf("互不相同且无重复数字的三位数的个数为 : %d\n ",n);
for(i=0;i<n;i++)
printf("%d\n",result[i]);
}
#include"stdio.h"
void main()
{
int i,j;
for(i=1;i<10;i++)
{
for(j=1;j<10;j++)
{
printf("%d*%d=%2d ",i,j,i*j);
}
printf("\n");
}
}
//第三题放不下,有字数限制,把邮箱告诉我,给你发过去
#include"stdio.h"
#include"stdlib.h"
struct student
{
int num;
char name[16];
float score[3];
float ave;
};
int main()
{
FILE *fp;
student stu[10];
int i,j,temp;
int aves[10];
/*数据输入*/
if((fp=fopen("stud.txt","w+"))==NULL)
{
printf("文件打开失败!\n\n");
system("PAUSE");
return 0;
}
fprintf(fp,"学号 姓名 成绩1 成绩2 成绩3 平均成绩\n");
for(i=0;i<10;i++)
{
printf("第%d个学生学号:",i+1);
scanf("%d",&stu[i].num);
printf("姓名:");
scanf("%s",&stu[i].name);
printf("成绩1:");
scanf("%f",&(stu[i].score[0]));
printf("成绩2:");
scanf("%f",&(stu[i].score[1]));
printf("成绩3:");
scanf("%f",&(stu[i].score[2]));
stu[i].ave=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;
fprintf(fp,"%-10d %-10s %-4g %-4g %-4g %f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
}
fclose(fp);
/*排序*/
if((fp=fopen("stu_sort.txt","w+"))==NULL)
{
printf("文件打开失败!\n\n");
system("PAUSE");
return 0;
}
for(i=0;i<10;i++)
aves[i]=i;
/*冒泡排序*/
for(i=0;i<10;i++)
{
for(j=0;j<10-i;j++)
{
if(stu[aves[j]].ave>stu[aves[j+1]].ave)
{
temp=aves[j];
aves[j]=aves[j+1];
aves[j+1]=temp;
}
}
}
fprintf(fp,"学号 姓名 成绩1 成绩2 成绩3 平均成绩\n");
for(i=0;i<10;i++)
fprintf(fp,"%-10d %-10s %-4g %-4g %-4g %f\n",stu[aves[i]].num,stu[aves[i]].name,stu[aves[i]].score[0],stu[aves[i]].score[1],stu[aves[i]].score[2],stu[aves[i]].ave);
fclose(fp);
return 0;
}
F. C语言里链表节点的数据里嵌套另一个链表数据头指针的问题(求解答)
要在第二条语句前先创建linklist_2 *类型的变量top2_,和flight *类型的变量data1,
即:
linklist_2 *top2_=(linklist_2 *)malloc(sizeof(linklist_2));
flight *data1=(flight *)malloc(sizeof(flight));
然后
data1->top2=top2_;
top->data=data1;
...
当然,这里要改
typedef struct lnode_1
{
flight *data;//"航班信息"实际数。这里改下!!! flight *data;
lnode_1 *next;//指向下一个节点的指针
}linklist;//存储"航班信息"的链表
时间有点晚,没测试,如果不行的话追问哦!谢谢!明天可以测试下!
G. 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.
H. C语言结构体内的指针问题
这个问题很直观。当struct student_a st1=st;时只将结构体变量st中的指针name拷贝到了st1中的指针变量name,就是说只使st1.name和st.name同时指针了由st.name=malloc(100);动态分配的片区,并没有重新再为st1.name分配100个字节。你可以这样考虑:1.如果由malloc分配的堆片区可以再复制,那怎么释放?2.你可以用sizeof(st1)测试一下看看有没有那100个字节(其实st中也没有那100个字节)。malloc分配的片区在堆里放着,只是让某个指针指向了它。那么,你在printf前free了它,它就可能被系统重新分配,所以输出就乱了……
I. 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.
J. 问个C语言结构体中的结构体指针问题,求大家回答。
你的第一个main函数:
strcpy(al->Check->UserName,"MyName");
这个访问方式不对,应该是:
strcpy(al.Check->UserName,"MyName");
当然,这不是主要的问题,主要问题正如你所说,没有为al.Check分配内存空间,也就是al.Check的值是乱码,al.Check所指向的内存空间你是无权操作的,所以会导致非法内存的访问。
理了一下你的思路,你的意思是说希望能定义一个AL_t的结构体变量之后到使用UpdateData函数操作它之前,你还需要做太多的操作,希望简化这些操作?是吧?
方案一:
将
typedef
struct
{
Check_t
*Check;
}AL_t;
改为
typedef
struct
{
Check_t
Check;//直接定义成值类型
}AL_t;
方案二:
参照面向对象的方式:构造->使用->析构
#include<stdlib.c>//记得包含头文件
写一个初始化函数:
init_AL_t(AL_t*
t)
{
t->Check=(Check_t*)malloc(sizeof(Check_t));
}
删除函数
destroy_AL_t(AL_t*
t)
{
free(t->Check);
}
这种方式不太推荐,因为使用完后一定要free,不然会内存泄露,改变Check时也要free,否则同样会有内存泄露的问题。