黑马程序员-指针的初步认识

时间:2023-02-20 23:31:56

指针的概念:在计算机中数据式存储在存储器中的,存储器的一个字节称为一个内存单元,不同的系统不同的数据类型它所占据的内存单元不是同的,在64位的系统里,一个整型占据4个字节,一个字符占据1个字节,为了方便访问内存单元,每一个内存单元都有一个编号,这个编号也叫地址,通过地址可以找到相应的内存单元,所以我们就称这个地址为指针。所以说指针实际就是内存的编号或者说是地址。

指针访问变量:在没有学到指针之前我们修改一个变量一般是这么做的:

1 int a = 5;
2 
3 a = 8;

第一行代码是定义个整型变量a并初始化将(这里系统会把变量名a转化为变量的地址),第三行是访问a所指向的地址修改相应的值,这种通过变量名引用变量,由系统自动完成变量名和其存储地址之间的转换,称为变量的"直接引用"方式。

指针变量的定义的一般形式:

类型标识符  *指针变量名

  • 类型标识符说明了这个指针变量所指向的变量类型,不能指向为其他类型
  • 变量名前面的“*”只是一个指针说明符,不是指针变量名的一部分
int *p1; //指向int类型数据的一个指针变量p1

float *p2; //指向float类型数据的一个指针变量p2

char *p3; //指向char类型数据的一个指针变量p3

 

指针如何访问变量:

1 int a = 8;
2 
3 int *p;
4 
5 p = &a;
6 
7 *p = 9;

第5行代码是取到变量a的地址赋值给指针p,这样p就指向了变量a,第7行代码是将9赋值给p所指向的内存单元,这里的“*”是指针运算符,与第三行的“*”有着完全不同的意义。如果省略掉这第7行的*,就相当于把9赋值给指针p,这是不允许的,因为指针变量是用来存放变量地址的,不要给它随意赋值一个常数

指针定义的同时可以初始化(上述代码的第5行和第7行可以合并为一行)

1 int *p = &a;

指针的使用注意

  • 指针变量在没有指向任何变量之前禁止赋值
1 //错误代码
2 int *p;
3 
4 *p = 9;
  • 指针变量的类型一定要和其所指向变量的类型一致
1 //错误代码
2 int a = 9;
3 
4 float *p;
5  
6 p = &a;
  • 指针变量的存储和其他变量的存储一样也会占用一定大小的内存单元
1 #include<stdio.h>
2 
3 int main(){
4     
5     int *p1;
6     char *p2;
7     
8     printf("%ld----%ld\n",sizeof(p1),sizeof(p2));
9 }

运行的结果为:黑马程序员-指针的初步认识

c中指针变量所占用的内存大小都是8个字节,无论该指针变量是指向int类型的还是char类型的

 

指针的简单应用:要求:通过函数的调用实现变量a与变量b的值互换

 1 //错误代码
 2 #include<stdio.h>
 3 //交换a与b值的函数
 4 void swap(int a,int b){
 5     int temp;
 6     temp = a;
 7     a = b;
 8     b = temp;
 9 }
10 int main(){
11     
12     int n1 = 4;
13     int n2 = 6;
14     
15     swap(n1,n2); //调用交换函数
16     printf("%d----%d\n",n1,n2);
17     return 0;
18 }

你会发现程序的运行结果不是你想要的效果,主要是因为函数的形参只是数值的传递,形参数值的改变并不能改变实参的数值

示意图黑马程序员-指针的初步认识所以这样之恩能够是将形参a与b的值互换了一下,一旦函数调用结束,系统就会自动回收形参的值,所以就达不到题目的要求,对于初学者还有可能会犯以下错误:

 1 //错误代码
 2 #include<stdio.h>
 3 //交换a与b值的函数
 4 void swap(int *p1,int *p2){
 5     int *temp;
 6     temp = p1;
 7     p1 = p2;
 8     p2 = temp;
 9 }
10 int main(){
11     
12     int n1 = 4;
13     int n2 = 6;
14     int *p_n1 = &n1;
15     int *p_n2 = &n2;
16     
17     swap(p_n1,p_n2); //调用交换函数
18     printf("%d----%d\n",*p_n1, *p_n2);
19     return 0;
20 }

程序运行完的结果依然不是你想要的效果,我们可已从以下另个示意图中看出其中的原因

调用刚开始:黑马程序员-指针的初步认识一旦交换了p1和p2的值后黑马程序员-指针的初步认识只要程序跳出被调函数,指针p1和p2就会消失。

正确地做法是:

 1 #include<stdio.h>
 2 //交换a与b值的函数
 3 void swap(int *p1,int *p2){
 4     int temp;
 5     temp = *p1;
 6     *p1 = *p2;
 7     *p2 = temp;
 8 }
 9 int main(){
10     
11     int n1 = 4;
12     int n2 = 6;
13     int *p_n1 = &n1;
14     int *p_n2 = &n2;
15     
16     swap(p_n1,p_n2); //调用交换函数
17     printf("%d----%d\n",*p_n1, *p_n2);
18     return 0;
19 }

这个程序与上面的程序的不同的是,它通过指针变量简介访问并修改了main函数里面的两个整型变量n1和n2,这个例子很好的给我们演示了通过指针如何用一个函数修改另一个函数内部的变量值,若果没有指针,是不可能办到的,其实只针的魅力远远不止这些,以后的学习中我们相继会碰到