C语言之指针

  • 指针与变量
  • 指针与一维数组
  • 指针与二维数组

1、指针与变量

1.1、指针的概念与定义

  • 指针即地址;
  • 变量的指针即变量的地址;
  • 定义指针的形式一般为:
    • 基本类型 *指针变量名;
    • 例如:int *p;
      • 指针说明符:说明后面的变量是指针变量

1.2、指针的赋值(赋地址)

  • 1、通过 取地址运算符 赋值
#include <stdio.h>
int main()
{
	int a,*p;
	p = &a;
	return 0;
}
  • 2、通过另一个指针
#include <stdio.h>
int main()
{
	int a,*p,*q;
	p = &a;
	q = p;
	return 0;
}
#include <stdio.h>
 
int main ()
{
    int var_runoob = 10;
    /**
		指针即地址;
		变量的指针即变量的地址;
	*/
    int *p;              // 定义指针变量
    p = &var_runoob;
 
   printf("var_runoob 变量的地址: %p\n", p);	
   //var_runoob 变量的地址: 0x7ffeeaae08d8

	k = &n;
	*k = n;
   return 0;
}

指针的定义

1.3、空指针的定义:

#include <stdio.h>
int main()
{
	int *p = NULL;	// int *p = 0;
	/*
		说明:
			NULL表示空,其值为 0
			空指针定义不能引用
	*/
	int *q;
	q = p;
	return 0;
}

1.4、指针的操作

“&”:取 地址 运算符
“*”:取内容运算符。
int *p; 定义时 * 为指针说明符。

#include <stdio.h>
int main()
{
	int a = 3,b,*p;
	p = &a;
	b = *p + a;
	printf("%d,%d\n",a,b);
	return 0;
}

1.5、二重指针

用于存储指针的地址
*p:针对指针变量

#include <stdio.h>
int main()
{
	int *p = &a;
	int **p;	//存储的指针p的地址
	int **p = &p;
	return 0;
}

指针的指针

2、指针与一维数组

2.1、一维数据的地址

一维数据的地址

2.2、一维数组的表达式

  • a <====> &a[0]
  • a + i <====> &a[i]
  • *(a+i) <==⇒ a[i]

2.3、指向一维数组的指针

#include <stdio.h>
int main()
{
	int a[] = {12,13,14,2,50,6,7},*p,*q;
	p = a;	// 相当于 p = &a[0]
	q = p + 1; 	// 相当于 q = &a[i];
	return 0;
	
	*p = 12;	//这里 *p 的作用是取指针变量 p 的内容
	*(p + 2) = a[2];	//相当于取值操作,取 a[2] 的值
	 q[2] = 2;	// 指针指向那个元素,那个元素就是首元素
}

2.4、指针的自增自减

指针自增:---------》 后移
指针自减:---------》左移

#include <stdio.h>
int main()
{
	int a[] = {5,10,15,20,25},*p = a;
	*++p;	// 指针右移,10
	*--p;	// 指针左移,5
	
	++*p;	// 11
	*p++;	// 11
	*p;		// 15
	// 靠近结合

	a++;		// 不合法,
	a+1;		// 相当于 &a[1];		合法

	/*
		数组名是地址常量,不可进行自增自减运算
		指针是变量,可以进行自增自减运算。
	*/
	return 0;
}

2.5、指针比较大小

指针比较大小就是所在 位置比较大小
指针相减就是位置相减
指针 不可相减

#include <stdio.h>
int main()
{
	int a[10],*p = a, *q = a + 3;	// *p = &a[0];	*q = &a[3];
	p > q;	// 0 ,0 > 3
	p < q;	// 1 ,0 < 3
	q - p;	// 3 , 3 - 0
	q + p;	// 指针不可相加
	return 0;
}

2.6、函数之间对一维数组的引用

函数和一维数组之间传递参数的方式

3、指针与二维数组

3.1、二维数组的指针

二维数组

3.2、二维数组地址和内容的引用方式

*(a+1) + 2:第一行 第二列 的 地址
((a+2)+3):第二行 第三列 的内容
a[1] + 2:第一行 第二列的 地址
*(a[2] + 3):第二行 第三列的 内容
*,[] 出现任意一个代表地址;
出现任意 两个代表 内容;

3.2.1、一维数组 a 中某元素引用的两种方式

①:a[i] ②:*(a+i)

3.2.2、二维数组 a 中某元素引用的四种方式

①:a[i][j]
②:((a+i)+j)
③:(a[i]+j)
④:(
(a+i))[j]

3.3、数组指针

int (*p)[4];		// p 为 int 类型 数组的指针

3.4、指针的数组

int *q[3];		//优先级 () > [] > *  指针数组
q[0]、q[1]、q[2] 均为 int *;

3.5、函数指针

int (*p)();		// 函数指针

3.6、指针函数

int *p();		// 指针函数

函数类型可以是任意型,所以返回值也可以是任意类型。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编码失了智

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值