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语言代码片段

更新:C++ 指针片段

c语言中如何通过二级指针来操作二维数组

初学c语言指针问题

C语言判定指针类型

C 语言行指针与列指针详解