程序运行的时候要位于内存之中
内存可以当成一个一个的格子,每个格子都有编号,一个格子对应一个字节
定义一个变量,必定有内存来存储它,不管是什么类型的变量;int *p;指针变量p
定义了指针变量,如果没有现成的结构赋值给指针变量,就需要通过手动分配内存的方式来初始化指针变量。
p=&a(变量名);取址符号,取出变量a的存储地址赋给变量P。
*p=0x12345678;地址p所指向的地方,存储的内容设置为0x12345678;
*变量:把变量p的值作为地址,去访问这个地址处的内存所存储的内容。
指针例子如下:
#include <stdio.h> 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; }
链表是一种数据结构,有基本数据类型构成。
利用好内存不连续的资源,联系到一起。
结构体的成员包含自己的指针。
链表头:结构体指针。
链表有如下类似结构:
typedef struct NAME{ char *name; struct NAME *pre; struct NAME *next; }T_Name, *PT_Name; static PT_Name g_ptNameHead;//定义链表头 #include <stdio.h> #include <stdlib.h> #include <string.h> 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("d : %s\n", i++, ptCur->name); ptCur = ptCur->next; } } int main(int argc, char **argv) { char c; while (1) { printf("<l> List all the names\n"); printf("<a> add one name\n"); printf("<d> del one name\n"); printf("<x> 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; }