指针是C语言的核心,数据结构需要有指针的基础。
内存编号 = 内存单元的地址 = 指针存放的变量
通俗而言就是,普通变量存放的是值;指针存放的是内存编号。通过指针可以对内存进行灵活的操作
指针不是地址而是用来存放地址的,申请的何种指针类型也只能存放何种类型变量的地址,而不能存放变量的值。
p = i; //erro,不能存放变量
p = &i; p保存了i的地址,在计算机组成原理中,申请的变量存放在内存条的内存中,内存条可以想想成一个柜子,指针就是写有变量柜号的纸条。
p与i互不相等,互不影响。无论哪个的值进行了修改都不会对另外一方产生影响
p存放地址变量,i存放数值变量
如果一个指针变量指向了某个普通变量,则 *指针变量 就完全等价于等同于 普通变量
例子:
如果p是个指针变量,并且p存放了普通变量i的地址
则p指向了普通变量
*p 就完全等同于 普通变量
内存编号 = 内存单元的地址 = 指针存放的变量
#include <stdio.h>
int main()
{
int number = 10;
int *ptr = &number;
printf("number的地址=%p\n",&number);
printf("number的数值=%d\n",number);
printf("*ptr指向的数值=%d\n",*ptr); //通过间接运算符计算的*ptr的数值为5
printf("ptr的数值=%p\n",ptr);
printf("ptr的数值=%p\n",&ptr);
return 0;
}
/*
-------------------------------
number的地址=000000000062FE1C
number的数值=10
*ptr的数值=10
ptr的数值=000000000062FE1C
ptr的数值=000000000062FE10
--------------------------------
Process exited after 0.9378 seconds with return value 0
请按任意键继续. . .
*/
通过指针修改number的数值
#include <stdio.h>
int main()
{
int number = 10;
int *ptr = &number;
printf("number的数值为%d/n",number);
*ptr = 15;
printf("number的数值为%d",number);//修改了指针指向的数值,number的数值也会发生改变
//指针将不连续的数据链接在一起
return 0;
}
结构体指针
#include <stdio.h>
//链表节点的数据结构
struct ListNode //申明结构体
{
int val;//数据域
struct ListNode *Next;// 是链接下一个节点的指针
};
int main()
{
int val; //val就是数据域
struct ListNode a,b,c,d,e;
a.val = 1; //a的数值空间存放1
b.val = 2;
c.val = 3;
d.val = 4;
e.val = 5;
a.Next = &b; //a的指针存储b的地址
b.Next = &c; //b的指针存储c的地址
c.Next = &d;
d.Next = &e;
e.Next = NULL; //最后一个节点的指针设置为空
printf("a存放的数值=%d,存放的地址=%p\n",a.val,a.Next);
struct ListNode *head = &a; //将指针的head指向节点a
while(head)
{
//通过循环打印链表中节点的数值、节点的地址和节点的next指针
printf( " val = %d address = %p next = %p \n",head->val,head,head->Next); //循环打印链表中节点的数值、节点的地址和节点的next指针
head = head->Next ;
}
//完成独立节点的创建、链接和遍历
return 0;
}
/*
在Dev-c++ 5.11的输出结果为:
-----------------------------------------------------------
a存放的数值=1,存放的地址=000000000062FDF0
val = 1 address = 000000000062FE00 next = 000000000062FDF0
val = 2 address = 000000000062FDF0 next = 000000000062FDE0
val = 3 address = 000000000062FDE0 next = 000000000062FDD0
val = 4 address = 000000000062FDD0 next = 000000000062FDC0
val = 5 address = 000000000062FDC0 next = 0000000000000000
-----------------------------------------------------------
Process exited after 0.9275 seconds with return value 0
请按任意键继续. . .
*/