當前位置:首頁 » 編程語言 » c語言嵌套結構的指針問題
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言嵌套結構的指針問題

發布時間: 2022-11-18 04:21:32

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,否則同樣會有內存泄露的問題。