c疑难点
Posted 飞雪天龙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c疑难点相关的知识,希望对你有一定的参考价值。
很容易得出p[-2]=10,p[-1]=20,p[0]=30,p[1]=40,p[2]=50,p[3]=60;
p++,指针p往后移一个单位,则p=a+3,此时p[0]=*(p+0)=40;
*p++, 是先取出*p的值,再执行p++操作, 则*p++=40,p=a+4;
*++p,p先往后移一个单位,再取对应地址的值,则*++p=60;
++*p, 则是先取出*p的值,对*p的值再加1,则++*p=61;
int a=0; int * const p=&a; //指向整型的常指针 指针指向的内容可变,指针的指向不可变(地址不可变) const int *p=&a; //指向常整型的指针 指针指向可变,指向内容不可变 const int * const *p=&a;//指向常整型的常指针 指针指向内容和指向都不可变
#include
#include
int main()
int a=100, b=200;
const int *p = &a;
int * const q = &b;
printf("a=%d, *p=%d\\n", a, *p);
printf("b=%d, *q=%d\\n", b, *q);
/* 不可利用*p 间接更改a变量值
*p=b;
*/
/* 但可以将p指针指向另一变量的地址 */
p=&b;
printf("*p=%d\\n", *p);
/*===========================*/
/* 不可更改 q 指针指向另一变量的地址
q=&a;
*/
/* 但可以利用q指针间接更改b变量值 */
*q=888;
printf("*q=%d\\n", *q);
getch();
return 0;
数组和指针
1.
int arr[]= 100, 101, 102;
int *ptr = arr;
size = (sizeof arr/ sizeof (arr[0]) );
&arr[0] == arr+0 ==ptr+0 ==100的地址
*(arr+0) ==arr[0] ==ptr[0] == *(ptr+0) ==100
2.
int k[3][4] = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11;
&k[1][2] == *(k + 1) + 2 =k[1]+2 ==6的地址
上面的表达式加*号为数值6
*(k[1] + 2) == *( (k[1]) +2 ) == k[1][2] ==6
3
char *parr[] = "Department", "of", "Information", "Management";
*parr[3] == **(parr+3) ==M
*(parr+2) == Information
4.
int arr2[3][4] = 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22;
int *parr[3] = arr2[0], arr2[1], arr2[2];
*(parr + 1) == parr[1] + 0 ==8的地址
*(parr[1] + 1) ==10
结构体
1. 内存地址
/* 声明结构变量 */
struct employee
char id[7]; /* ID号码 */
char name[20]; /* 员工姓名 */
int salary; /* 所得薪资 */
;
/* 定义结构变量,并设定其初始值 */
struct employee manager = "D54321", "Peter", 35000;
/* 定义结构指针变量ptr,将它指向结构变量manager的地址 */
struct employee *ptr = &manager;
/* 输出内存的地址 */
&ptr= 18ff1c
ptr= 18ff20
&manager= 18ff20
manager.id = 18ff20
ptr->id = D54321
(*ptr).id =D54321
2.结构体定义
struct student
char firstname[20];
char *lastname;
int score;
;
struct student st1, *st2;
scanf("%s", st1.firstname); /* 不可以使用指定运算符 */
st1.lastname="小英"; /* 不可以使用scanf函数来输入 */
st2 = (struct student *)malloc(sizeof(struct student));
scanf("%s", st2->firstname); /* 不可以使用指定运算符 */
st2->lastname="小明"; /* 不可以使用scanf函数来输入 */
3. 结构体传递地址
结果:#include <stdio.h>
#include <conio.h>
struct student
char name[20];
int score;
char *passdown;
;
void passOrdown(struct student *);
void output(struct student *);
int main()
struct student stu;
printf("请输入姓名: ");
scanf("%s", stu.name);
printf("请输入C语言的分数: ");
scanf("%d", &stu.score);
passOrdown(&stu);
output(&stu);
getch();
return 0;
void passOrdown(struct student *p)
if (p->score >= 60)
p->passdown = "PASS"; //调用时使用&传递地址,导致函数中改变变量的值可以返回,在output函数中使用得以输出
else
p->passdown = "DOWN";
void output(struct student *q)
int i;
printf("\\n\\n%10s %10s %20s\\n", "Name", "Score", "Pass or Down");
for(i=1; i<=42; i++)
printf("=");
printf("\\n");
printf("%10s %10d %20s\\n", q->name, q->score, q->passdown);
4.结构体数组
struct student stu[3];
int i;
for(i=0; i<3; i++)
printf("请输入第 #%d 位同学的姓名: ", i+1);
scanf("%s", stu[i].name);
printf("请输入第 #%d 位同学C语言的分数: ", i+1);
scanf("%d", &stu[i].score);
printf("\\n");
passOrdown(stu);
output(stu);
getch();
return 0;
void passOrdown(struct student *p)
int i;
for(i=0; i<3; i++)
if (p->score >= 60)
p->passdown = "PASS";
else
p->passdown = "DOWN";
p++;
例子:
struct student st[]= "John", 90, st+1,
"Mary", 85, st+2,
"Peter", 92, st ;
void output(struct student *q)
int i;
printf("\\n\\n%10s %10s %20s\\n", "Name", "Score", "Pass or Down");
for(i=1; i<=42; i++)
printf("=");
printf("\\n");
for(i=0; i<3; i++)
printf("%10s %10d %20s\\n", q->name, q->score, q->passdown);
q++;
5.结构体中有结构体
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
struct node
char *name;
int score;
struct node *next;
;
struct node *p, *q;
p = (struct node *) malloc(sizeof(struct node));
p->name = "Mary";
p->score = 80;
p->next = NULL;
q = (struct node *) malloc(sizeof(struct node));
q->name = "John";
q->score = 90;
q->next = p;
printf("%s %d\\n", q->name, q->score);
printf("%s %d\\n", q->next->name, q->next->score);
getch();
return 0;
6.
struct student
char *name;
int score;
struct student *next;
;
struct student st[]= "John", 90, st+1,
"Mary", 85, st+2,
"Peter", 92, st ;
struct student *ptr[]=st, st+1, st+2;
++(*ptr)->next)->name =peter
(*ptr)->next->next->name)=peter
双链表
队列
点击(此处)折叠或打开
- /* doublyListRandom.c */
- /* 双链表的加入与删除: 以分数的高低加以排序 */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <conio.h>
- void init_f(void); /* 初始化链表,建立一空节点为HEAD */
- void insert_f(void); /* 插入函数 */
- void delete_f(void); /* 删除函数 */
- void display_f(void); /* 输出函数 */
- void modify_f(void); /* 修改函数 */
- struct student
- char name[20]; /* 姓名 */
- int score; /* 分数 */
- struct student *llink; /* 节点左链结 */
- struct student *rlink; /* 节点右链结 */
- ;
- struct student *ptr, *head, *tail, *current_n, *prev;
- int main()
- char option1;
- init_f();
- while(1)
- printf("\\n ****************\\n");
- printf(" 1.insert\\n");
- printf(" 2.delete\\n");
- printf(" 3.display\\n");
- printf(" 4.modify\\n");
- printf(" 5.quit\\n");
- printf(" *******************\\n");
- printf(" Enter your choice (1-5): ");
- option1 = getche();
- switch(option1)
- case '1':
- insert_f();
- break;
- case '2':
- delete_f();
- break;
- case '3':
- display_f();
- break;
- case '4':
- modify_f();
- break;
- case '5':
- printf("\\n");
- return 0;
- void init_f(void) /* 设一HEAD,将左右链结都指向本身 */
- ptr = (struct student *) malloc(sizeof(struct student));
- strcpy(ptr->name, "0");
- ptr->llink = ptr;
- ptr->rlink = ptr;
- head = ptr;
- tail = ptr;
- /* 根据分数的高低加入 */
- void insert_f(void)
- char s_temp[4];
- ptr = (struct student *) malloc(sizeof(struct student));
- printf("\\n Student name : ");
- gets(ptr->name);
- printf(" Student score: ");
- gets(s_temp);
- ptr->score = atoi(s_temp);
- prev = head;
- current_n = head->rlink;
- while((current_n != head) && (current_n->score >= ptr->score))
- prev = current_n;
- current_n = current_n->rlink;
- ptr->rlink = current_n;
- ptr->llink = prev;
- prev->rlink = ptr;
- current_n->llink = ptr;
- void delete_f(void)
- char del_name[20], ans;
- int count = 0;
- if(head->rlink == head)
- printf("\\n No student record\\n");
- else
- printf("\\n Delete student name: ");
- gets(del_name);
- prev = head;
- current_n = head->rlink;
- while ((current_n != head) && (strcmp(current_n->name,
- del_name)!=0))
- prev = current_n;
- current_n = current_n->rlink;
- if (current_n != head)
- /* 确认是否要删除 */
- printf(" Are you sure? ");
- ans=getche();
- if (ans == 'Y' || ans == 'y')
- prev->rlink = current_n->rlink;
- current_n->rlink->llink = prev;
- free(current_n);
- printf("\\n Student %s has been deleted\\n",del_name);
- else
- printf("\\n Student %s not found\\n",del_name);
- void modify_f(void)
- int count = 0;
- char n_temp[20], s_temp[4];
- if(head->rlink == head)
- printf("\\n No student recond\\n"); /* 无数据显示错误 */
- else
- printf("\\n Modify student name: ");
- gets(n_temp);
- current_n=head->rlink;
- while ((current_n != head) && (strcmp(current_n->name , n_temp)!=0))
- prev = current_n;
- current_n = current_n->rlink;
- if (current_n != head)
- printf("\\n **************************\\n");
- printf(" Student name : %s\\n",current_n->name);
- printf(" Student score: %d\\n",current_n->score);
- printf(" **************************\\n");
- printf(" Please enter new score: ");
- gets(s_temp);
- current_n->score = atoi(s_temp);
- printf("\\n %s student record(s) modified\\n", n_temp);
- else // 找不到数据则显示错误
- printf("\\n Student %s not found\\n",n_temp);
- void display_f(void)
- int count = 0;
- if(head->rlink == head)
- printf("\\n No student record\\n");
- else
- printf("\\n\\n NAME SCORE\\n");
- printf(" --------------------\\n");
- current_n = head->rlink;
- while(current_n != head)
- printf(" %-10s %3d\\n", current_n->name,
- current_n->score);
- count++;
- current_n = current_n->rlink;
- if(count % 20 == 0) getch(); /* 每次输出20条数据 */
- printf(" ---------------------\\n");
- printf(" Total %d record(s) found\\n", count);
点击(此处)折叠或打开
- /* queue.c */
- /* 加入在链表的尾节点和删除在头节点 */
- #include <stdio.h>
- #include <conio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <ctype.h>
- void Insert();
- void Delete();
- void Display();
- void Quit();
- struct student
-
- int id;
- int score;
- struct student *next;
- ;
- struct student *x,*head,*current, *prev;
-
- int main()
-
- /* 链表的第一个节点不存放数据 */
- head=(struct student *)malloc(sizeof(struct student));
- head->next= NULL;
- for(;;)
-
- int a;
- printf("\\n");
- printf("1)Insert\\n2)Delete\\n3)Display\\n4)Quit\\n");
- printf("Which one: ");
- scanf("%d",&a);
- printf("\\n");
- switch(a)
-
- case 1:Insert();
- break;
- case 2:Delete();
- break;
- case 3:Display();
- break;
- case 4:Quit();
- break;
-
-
- printf("\\n\\n~~~~~~~~~~~~~~~FINISH~~~~~~~~~~~~~~~~");
- getch();
- return 0;
-
-
- /* 加在尾节点 */
- void Insert()
-
- x=(struct student *)malloc(sizeof(struct student));
- printf("Please input your ID: ");
- scanf("%10d",&x->id);
- printf("Please input your score: ");
- scanf("%d",&x->score);
- x->next=NULL;
-
- if(head->next == NULL)
- head->next = x;
- else
-
- /* 追踪链表的尾节点 */
- current = head->next;
- while(current->next != NULL)
- current = current->next;
- current->next = x;
-
- printf("====================================\\n");
-
-
- /* 删除头节点 */
- void Delete()
-
- char ch;
-
- if(head->next == NULL)
- printf("The queue is empty!\\n");
- printf("====================================\\n");
- return;
-
- printf("Are you sure (y/n)? ");
- ch=getche();
- /* 确认是否要删除 */
- if(tolower(ch) == 'y')
-
- current = head->next;
- head->c疑难点
Java集合 -- 疑难点总结(Arrays.asList()正确使用Collection.toArray()正确使用反转数组 foreach 循环不要进行元素的 remove/add 操作)