C语言---指针

Posted 小鹿可可乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言---指针相关的知识,希望对你有一定的参考价值。

指针

1.一级指针

1.1指针定义

计算机中所有数据都必须放在内存中,为了正确访问这些内存,必须给每个字节编上号码,像门牌号,每个字节编码都是唯一的,内存中字节编号称为地址指针

  • 指针用来存放地址
  • 最小的地址:0X0000 0000
  • 最大的地址:0XFFFF FFFF
  • 程序能够使用的内存为4GB
  • 在指针定义中,*号和变量名结合

1.2指针的种类

  • 空指针
int *s=NULL;
  • 野指针
int *p;
  • 失效指针

1.3图解指针


	int a = 10, b = 20;
	int *ip = NULL;//* 声明ip是指针  空给ip
	ip = &a;//把a 的地址给ip   &*ip<=>&a
	
	*ip = 100;//a=>100
	ip = &b;//把b的地址给ip
	*ip = 200;
  • ip = &a;

  • ip存放谁地址,解引用就是谁本身

  • 使用指针变量首先要明确指针变量自身的值(存储的是地址),再明确指针变量所指的实体(解引用)

1.4类型对指针变量起到2个作用

1,解析存储单元的大小
2,指针变量加1的能力

int main()

	const int n = 5;
	double ar[5] =  1.2, 2.3, 3.4, 4.5, 5.6 ;
	double*p = &ar[0];
	for (int i = 0; i < n; ++i)
	
		printf("0x%08x =>%f \\n", p, *p);
		p = p + 1;//p+=1;p++;++p;

	


1.5指针的应用

  • 值传递(形参的改变不会影响到实参的值)
void Swap_a(int a, int b)

	int c = a;
	a = b;
	b = c;

int main()

	int x = 10, y = 20;
	Swap_a(x, y);
	printf("%d\\n%d\\n", x, y);
	return 0;

  • 指针传递(实参的地址传递给形参,才会改变实参的值)
void Swap_b(int *ap,int *bp)

	int c = *ap;
	*ap = *bp;
	*bp = c;


int main()

	int x = 10, y = 20;
	Swap_b(&x, &y);
	printf("%d\\n%d\\n", x, y);
	return 0;

  • 想改变某个变量的值必须有动作(赋值)存在,

2.二级指针

如果指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针

2.1图解二级指针

假设有一个int类型变量a,p1指向a的指针变量,p2又是指向p1的指针变量,它们的关系如图:

代码关系:

int a = 100;
int *p1 = &a;
int *p2 = &p1;

2.2指针关系

int a = 10, b = 20;
	int *ip = &a;
	int **sp = &ip;

	int ar[10] = ; //sizeof(ar); type+num
	ip = ar;  //ar =>&ar[0];
	
	int(*par)[10] = &ar;//type+num 存放数组的地址
	//定义par指针,开辟四个字节空间,指向大小为10,类型为int的数组

	int *pbr[10];//开辟10个空间(40个字节),每个空间是整型类型的指针

	int*(*sbr)[10] = &pbr;

3.函数指针

函数指针的本质是是一个指针,该指针的地址指向了一个函数,所以它是指向函数的指针。
函数类型两部分构成:返回类型+形参列表

    int fun(int, int);//函数声明

	//函数指针
	int(*pfun)(int, int);//定义一个pfun指针指向一个参数都为int类型的函数,返回类型int

3.1一个代码示例

int Add_Int(int a, int b)

	return a + b;


int Sub_Int(int a, int b)

	return a - b;

int main()

	
	int(*pfun)(int, int) = nullptr;//函数指针变量的定义
	int x = 10, int y = 20;
	int z = 0;

	//pfun = &Add_Int;
	pfun = Add_Int;//与上面等价
	z = Add_Int(x, y);
	z = pfun(x, y);    //new
	z = (*pfun)(x, y);//old

	pfun = Sub_Int;
	z = (*pfun)(x, y);
	return 0;


调用过程:

  • Add_Int; 函数首元素地址 Add_Int(); 调动此函数

  • 函数指针不能用sizeof计算函数指针所指之物大小,不能+1;

  • 无类型指针也不能计算大小 void

以上是关于C语言---指针的主要内容,如果未能解决你的问题,请参考以下文章

C 语言----- 指针

在形参指针所指的4个整数中找出最大值和最小值(C语言)

在形参指针所指的4个整数中找出最大值和最小值(C语言)

在形参指针所指的4个整数中找出最大值和最小值(C语言)

在形参指针所指的4个整数中找出最大值和最小值(C语言)

浅谈C语言的动态内存开辟