1、C语言指针操作
程序运行的时候要位于内存之中
内存可以当成一个一个的格子,每个格子都有编号,一个格子对应一个字节
定义一个变量,必定有内存来存储它,不管是什么类型的变量;int *p;指针变量p
定义了指针变量,如果没有现成的结构赋值给指针变量,就需要通过手动分配内存的方式来初始化指针变量。



p=&a(变量名);取址符号,取出变量a的存储地址赋给变量P。
*p=0x12345678;地址p所指向的地方,存储的内容设置为0x12345678;
*变量:把变量p的值作为地址,去访问这个地址处的内存所存储的内容。
指针例子如下:
#include
typedef struct {
int a;
int b;
}T_AB;
int main(int argc, char **argv)
{
char c;
int a;
T_AB tTest;
int *p;
int **pp;
/* 1. */
p = &a;
printf("p = 0x%x, a'addr = 0x%x\n", p, &a);
/* 2. */
*p = 0x12345678;
printf("a = 0x%x\n", a);
/* 3. */
p = &c;
printf("p = 0x%x, c'addr = 0x%x\n", p, &c);
/* 4. */
*p = 'A';
printf("c = %c\n", c);
/* 5. */
p = &tTest;
printf("p = 0x%x, tTest'addr = 0x%x\n", p, &tTest);
/* 6. */
*p = &tTest;
printf("tTest.a = 0x%x, tTest'addr = 0x%x\n", tTest.a, &tTest);
/* 7. */
pp = &p;
printf("pp = 0x%x, p'addr = 0x%x\n", pp, &p);
/* 8. */
**pp = 0xABCD1234;
printf("tTest.a = 0x%x\n", tTest.a);
return 0;
}


二、C语言链表操作
链表是一种数据结构,有基本数据类型构成。
利用好内存不连续的资源,联系到一起。
结构体的成员包含自己的指针。
链表头:结构体指针。
链表有如下类似结构:
typedef struct NAME{
char *name;
struct NAME *pre;
struct NAME *next;
}T_Name, *PT_Name;
static PT_Name g_ptNameHead;//定义链表头
#include
#include
#include
typedef struct NAME{
char *name;
struct NAME *pre;
struct NAME *next;
}T_Name, *PT_Name;
static PT_Name g_ptNameHead;//定义链表头
void add_name(PT_Name ptNew)
{
PT_Name ptCur;
if (g_ptNameHead == NULL)
{
g_ptNameHead = ptNew;
}
else
{
ptCur = g_ptNameHead;
while (ptCur->next)
{
ptCur = ptCur->next;
}
ptCur->next = ptNew;
ptNew->pre = ptCur;
}
}
void del_name(PT_Name ptDel)
{
PT_Name ptCur;
PT_Name ptPre;
PT_Name ptNext;
if (g_ptNameHead == ptDel)
{
g_ptNameHead = ptDel->next;
/* 释放 */
return;
}
else
{
ptCur = g_ptNameHead->next;
while (ptCur)
{
if (ptCur == ptDel)
{
/* 从链表中删除 */
ptPre = ptCur->pre;
ptNext = ptCur->next;
ptPre->next = ptNext;
if (ptNext)
{
ptNext->pre = ptPre;
}
break;
}
else
{
ptCur = ptCur->next;
}
}
}
free(ptDel->name);
free(ptDel);
}
void add_one_name()
{
PT_Name ptNew;
char *str;
char name[128];
printf("enter the name:");
scanf("%s", name);
str = malloc(strlen(name) + 1);
strcpy(str, name);
ptNew = malloc(sizeof(T_Name));
ptNew->name = str;
ptNew->pre = NULL;
ptNew->next = NULL;
add_name(ptNew);
}
PT_Name get_name(char *name)
{
PT_Name ptCur;
if (g_ptNameHead == NULL)
{
return NULL;
}
else
{
ptCur = g_ptNameHead;
do {
if (strcmp(ptCur->name, name) == 0)
return ptCur;
else
ptCur = ptCur->next;
}while (ptCur);
}
return NULL;
}
void del_one_name()
{
PT_Name ptFind;
char name[128];
printf("enter the name:");
scanf("%s", name);
ptFind = get_name(name);
if (ptFind == NULL)
{
printf("do not have this name\n");
return ;
}
del_name(ptFind);
}
void list_all_name(void)
{
PT_Name ptCur;
int i = 0;
ptCur = g_ptNameHead;
while (ptCur)
{
printf("%02d : %s\n", i++, ptCur->name);
ptCur = ptCur->next;
}
}
int main(int argc, char **argv)
{
char c;
while (1)
{
printf(" List all the names\n");
printf(" add one name\n");
printf(" del one name\n");
printf(" exit\n");
printf("Enter the choise: ");
c = getchar();
switch (c)
{
case 'l':
{
list_all_name();
break;
}
case 'a':
{
add_one_name();
break;
}
case 'd':
{
del_one_name();
break;
}
case 'x':
{
return 0;
break;
}
default:
{
break;
}
}
}
return 0;
}

