指针
指针的定义: *类型名 指针变量名 如: int *p;
定义的同时进行初始化: int *p=&a;
引用指针变量: p = &a;//把a的地址赋给指针变量p
&取地址运算符、“ * ” 指针运算符,*p代表指针变量p指向的对象
指针对数组的引用
int a[5]={0,1,2,3,4};
int *p;
p = &a[0]; //表示把a[0]的地址赋值给指针p
或者写 p = a;//表示把数组a首元素的地址 ,即a[0]
数组指针的运算
*(p++)与 *(++p)是不同的;
① *(p++)是先取 *p 的值,然后使 p 加1;
② * (++p) 是先使p加 1,再取 *p;
++(*p)表示p所指向的元数值加1,即相当于++a[0];
*减法同理*
函数指针
int max(int ,int );
int (*p)(int,int) ; //定义指针函数
p = max; //表示将max函数的入口地址赋给指针变量p
指针数组作main函数的形参
int main() 或 int main(void) //表示函数没有参数,调用main函数时不必给出实参
int main( int argc , char argv[] ) // argc 和 argv 就是main函数的形参
//argc 参数个数; argv 参数向量
1.什么是链表
链表是动态地进行存储分配的一种结构。
作用是为了避免内存的浪费,它是根据需要开辟内存单元设定的。
2.单向链表
由 head 的 next 指向下个节点
头指针:head (整个链表都必须包含head)
结点 :必须包含两部分(1)用户需要用的实际数据 (2)下一个节点的地址
空指针(表尾):NULL
3.建立链表(利用结构体)
struct Student
{ int num;
float score;
struct Student *next; //next是指针变量,指向下一个结构体的地址
};
4.输出链表
void output(struct student *head) // 定义一个链表输出的函数
{
struct student *p; // 定义结构体指针变量p1,用于结点的后移,以实现输出操作
p = head; // 将head赋给p1,以实现对该链表的操作
if (p != NULL) // 建立一个while循环,结束条件是到达尾结点
do
{
printf("%d\n%f\n", p1->num, p1->score); // 输出结点中的数值部分
p1 = p1->next; // 将下一个结点的位置赋给p1
}while(p != NULL);//当p不是空地址时循环
}
5.注意
malloc()分配内存后最后记得free() 释放内存