C语言指针——初见指针

种一棵树最好的时间是十年前,其次是现在。

如有错误请指出,谢谢~

一、指针变量

在说指针变量之前,先说一下地址这个东西。现在大多数计算机里都是内存被划分为字节,然后每个字节可以储存8位信息,比如01010101,每个字节有唯一的地址

有的变量占据一个或多个字节内存空间,把第一个字节的地址看做这个变量的地址。

1.指针变量是储存变量地址的变量。

2.指针变量声明:

以前我们比如声明一个整形变量,int a; 现在说一下声明指针变量,一般在声明指针变量时我们使用p(它是point英文单词首字母来的)一个表示整形变量的指针 它这样声明 int *p; ,也可以这样说,指针p是一个指向int类型对象的指针变量。对于int p;我们的理解为声明了一个整形变量,现在在这个整形变量前面加一个*号,就表明声明的p是一个指针变量。

二、& 和 *   :取地址运算符和间接寻址运算符。

大家还记得在初学C语言时,遇到的scanf("%d",&a);这个语句吗,想必对&这个东西特别眼熟吧!

1.取地址运算符 &

顾名思义,比如 &a,就是把变量a的地址取出来。

指针变量是一个表示变量地址的变量,对于指针变量的初始化,我们使用取地址符号。

2.指针变量初始化

在使用指针p前必须对指针p进行初始化!

//方法一:
int i, *p;
p = &i;

//方法二:
int i;
int *p = &i;

//甚至也可以这样:
int i,*p = &i;

3.间接寻址运算符 * 

这个*(间接寻址)运算符不要和int *p;时的*搞混!

当指针p变量指向了对象,就可以使用*p访问到储存到对象中的内容。

只有p指向i,*p就是i的别名

例如:

int a = 3;
int *p = &a;
printf("%d",*p);

这个代码输出的就是 变量a的内容 3。

三、指针赋值

#include<stdio.h>
int main()
{
	int i = 0,j = 1;
	int *p = &i,*q = &j;
	//至此我们定义并初始化了两个整形变量和两个指针,p指向i,q指向j

	*p = 3;
	*q = 4;
	//对指针进行赋值,因为指针直接指向变量的地址,所以对*p *q进行赋值时就直接会改变他们指向的变量的值
	//因此到这里  i为3, j为4 

	printf("*p = %d\n*q = %d\n",*p,*q);
	printf("i = %d\nj = %d\n",i,j);
	
	return 0;
}

结果如下

指针赋值代码结果

四、指针为参数

1.我们都知道,当给函数传参时,实际参数的值是不会改变的,那么比如我们想要在一个函数中去改变一个实际参数的值,那应该怎么做?return它然后在主函数重新赋值?但是如果想要改变两个呢、三个呢、四个呢?

比如写一个交换数值的函数,给了a = 10 ;b = 3;c = 9;要两两交换这三个变量的值交换完是a = 3;b = 9;c = 10;写一个这样的函数我们如果简单的传入a b c三个参数,在函数内部交换之后,出了函数它们仍然还是原值.

#include<stdio.h>
int swap(int a,int b,int c);

int main()
{
	int a = 10,b = 3, c = 9;
	swap(a,b,c);
	printf("a=%d b=%d c=%d \n",a,b,c);
	
	return 0;
}

int swap(int a,int b,int c)
{
	int t;
	t = a;
	a = b;
	b = c;
	c = t;
	return 0;
}

运行之后你会发现他的结果并没有改变,怎么办?

用指针作为参数!因为指针可以指向这个变量所在的地址,可以使用*p的赋值来直接改变变量的值。

#include<stdio.h>
int swap(int *a,int *b,int *c);

int main()
{
	int a = 10,b = 3, c = 9;
	swap(&a,&b,&c);
	printf("a=%d b=%d c=%d \n",a,b,c);
	
	return 0;
}

int swap(int *a,int *b,int *c)
{
	int t;
	t = *a;
	*a = *b;
	*b = *c;
	*c = t;
	return 0;
}

去运行一下子试试吧~

2.这样我们的指针就多了一种运用场景:函数只能有一个返回值,而需要多个结果时,我们就可以用指针来带出多个结果。

当然,当某种可能出错的运算使用-1或者0当做返回值表示运行失败,若没有出错,这时我们也可以用指针来传出结果。

3.const一下试试?

const 定义的是变量,常变量。用 const 定义的变量的值不允许改变,可以说它定义的是只读变量。这也就意味着必须在定义的时候就给它赋初值。

我们可以用const保护参数

因为有的时候我们传入指针参数而又不希望它被改变,所以就const一下它。(当变量需要大量储存空间时,这时传递变量的值就会浪费时间和空间)

 

这些就是指针最基础的东西啦,后面还指针与数组,动态内存分配等等。

一起加油~!

猜你喜欢

转载自blog.csdn.net/qq_51182221/article/details/115011435