指针常量与常量指针
常量是不可修改不可赋值,在程序运行中其值是不会改变的。
c语言中声明一个常量指针形式如下:
1)常量指针
const int *p;
int const *p;
常量指针顾名思义是一个常量的指针,指向的是一个常量,这个常量能通过指针访问,但不能通过指针修改它的值。
void main()
{
int a = 100;
int b = 200;
const int *p = &a;
*p = 200;//非法,p指向的是一个常量,*p并非左值,不可赋值
p = &b;
printf("*p的值 :%d",%p);
}
从上,我们可以看到常量指针指向的值是常量不可更改,但指针的值是可以修改的。
2)指针常量
声明一个指针常量:
int a = 100;
int b = 200;
int *const p = &a;
p = &b; //错误,p是常量 不可赋值
指针常量表示指针是一个常量不可赋值。因为指针常量是一个常量,所以在声明的时候一定要赋初值。
指针的应用-----(链表的简单实现)
我们知道,链表的地址是不要求连续的,这使得空间利用率高
链表保存的内容包含数据和指针,指针指向下一个节点,如上图。
接下来,我们利用指针,实现简单的链表:
struct MyLinklist //定义一个结构体
{
int num; //保存内容
struct MyLinklist *pNext; //保存指针
};
typedef struct MyLinklist list; //为结构体取别名
void add(list **phead, int num)
{
if (*phead == NULL) // *phead为空,首位
{
list *newList = malloc(sizeof(list)); //分配内存
newList->num = num; //为num赋值
newList->pNext = NULL; //为指针变量赋值
*phead = newList; //初始化头指针
}
else
{
list *p = *phead;
while (p->pNext!=NULL)
{
p = p->pNext;//指针循环后移,直到最后一个节点
}
list *newList = malloc(sizeof(list)); //分配内存
newList->num = num; //为num赋值
newList->pNext = NULL; //为指针变量赋值
p->pNext = newList; //为上一节点的pNext赋值
}
};
void main()
{
list *head = NULL;
add(&head, 20);
add(&head, 30);
add(&head, 40);
add(&head, 50);
printf("添加后的数据,第0个:%d \n", head->num);
printf("添加后的数据,第1个:%d \n", head->pNext->num);
printf("添加后的数据,第2个:%d \n", head->pNext->pNext->num);
printf("添加后的数据,第3个:%d \n", head->pNext->pNext->num);
}
以上,我们实现了简单的链表,可以通过add()方法像链表中添加简单的数据。我们可以看出,链表实现空间不连续是利用指针。末位节点地址栏为空没有指向。
下篇,我们继续讲解指针,利用指针对链表进行简单遍历和删除。