指针和Linklist * L与Linklist L

在C中我们经常会遇到指针,通常大家看代码时也能看到很多指针,这里就总结一下有些指针用法和区别。

指针

数据对象存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针是一种保存变量地址的变量。

指针声明

	//法一:直接声明 
	int x = 1;
	int *p = &x;  

   //方法2:动态分配内存给指针 
	int *p;
	p = (int *)malloc(sizeof(int) * 10);    
	free(p); 

指针一定要先初始化

一些输出

int main(void)
{
	int i = 4;
	int * p = &i;
	printf("%d\n",*p);
	printf("%d\n",p);   //十进制输出 
	printf("%p\n",p);   //十六进制地址 
	printf("%d\n",&p);
}

输出结果:
在这里插入图片描述
对于第一个输出:
p是一个指针,变量i将自己的地址赋给指针p,*p是指向赋给指针变量的值,所以 *p和i的值是一样的。
对于第二个输出:
变量i将自己地址给p,所以p是指向的变量的地址,以十进制输出。
对于第三个输出:
%p是指针的输出格式,是以十六进制输出的。
对于第四个输出:
&是取内存地址,&p是指针p的自己的地址。

int main(void)
{
	int i = 4;
	int * p = &i;
	printf("%d\n",*p);
	printf("%d\n",p);   //十进制输出 
	printf("%p\n",p);   //十六进制地址 
	printf("%d\n",&p);
	int * ip = p; 
	int **x = &ip;
	printf("%d\n",ip);
	printf("%d\n",*ip); 
	printf("%d\n",&ip);
	printf("%d\n",**x);
	printf("%d\n",*x);
	return 0;
}

输出结果:
在这里插入图片描述

LinkList *L和LinkList L

在创建链表,链表的插入和删除中。都会用到指针。

typedef int ElemType;
typedef int Status;
typedef struct Node{
	ElemType data;
	struct Node *next;
}Node;
typedef struct Node * LinkList;
void CreateList(LinkList *L,int n);
Status InsertLinkList(LinkList * L,int i,ElemType e);
Status DeleteLinkList(LinkList *L,int i,ElemType *e);

插入和删除因为要改动,所以传的是地址。struct Node * 定义成了新类型 LinkList。这个类型是一个结构体的指针。若为LinkList L,那么L其实也是指针,是一个结构体指针,它指向链表。若将L的地址传给LinkList *L,那么LinkList *L是指向L的指针。
在这里插入图片描述
对于p = *L,对于这个理解,可以先从类型上来看,LinkList 是Node * 类型,那么LinkList *L就是Node **, *L类型就是Node *。所以类型上是对的。
p是指向链表的指针,而 *L是指向p的指针,L是p指针的地址, *L是p所指向的东西的值,所以可以这么写。
在这里插入图片描述
而这里L->next 的类型是Node *,p的类型也是Node *,所以可以这样赋值。
后面还有一篇用画图来理解这个问题
结构体指针的一些问题

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值