新手学习C/C++都跳不过去的地方,就是指针,用的话,确实好用,但是概念比较绕,

指针的通俗说法

1.简单的来说,就是说每一个变量,在电脑内都占一个地方,这个地方用一个16进掉的编号来进行标记,类似于,一个人有身份证,那要找你的时候,可以能过身份证来查找你的信息.指针,就是用来指向这个编号的.

2.这个地址是本身是常量,是改不了的,记住这一点,但是可以让指针,指向其他地址,这个是可以的,

比如你本人有一个身份证,你记住了号码,这时你的朋友他也有一张身份证,你也可以记住他的身份证号,但是此时,你的身份证不会因此改变.

3.声明指针 类型 * 变量名

声明一个指针,用来存放变量的地址,此时,这个指针就会指向这个变量的地址,那么,如果此时操作指针,就相当于在修改这个变量.

例如:

 

 可以看到,在=号的右边时我们用指针,将a的值赋给了变量b.

 

 如果直接输出p,我们得到了a的地址.

如果我们输入*p,即得到a的值

 

 

---->>>其中,指针的类型和要指向的变量地址的变量本身的类型要一致,不能说是字符型的指针,来指向一个整型的变量,这样是不可以的.<<<------重点!!!

变量的地址用&来表示取地址.那么此时,整型指针p,就指向了整变量a的地址.如果此时输出p就可以得到a的地址,如果想返回a的值,那么需要在p前加一个*号即可.

此处的*号和声明这里的*号是含意不同的.在=号运算符的右边或者输出的时候,此时叫解运算,即得到指针所指向的变量本身.

比如本例中,  int* p= &a;在=号左边时,称为左值,为左值时,此时是用来声明这个声针,如果为右值或者输出的时候,表示是取a的值.

 

插播一下:在C/C++中,如果用const关键字来声明一个常量,用指针是可以进行修改的,所以最好用宏定义来声明一个常量,用全大写来命名;

再插一下:常量,即不会改变的量,比如.圆周率,常记为:3.1415926,又比如一天有24个小时,白天12小时,晚上12小时,1小时60分钟,1分钟60秒,一周有7天,这些是不会改变的,即常量

    常量的声明方式为:#define HOUR

======================================================================================================

重点来了,无情分割线

======================================================================================================

当声明的指针类型为字符的时候,那么这个指针可以接收字符串,即可以看作以下的形式:

//声明一个字符数组

char chr_a[128]="hello";此时等价于 char* str="hello";

但是,要注意的是,最好不要直接给指针赋值,如上面这面 char* str="hello";这样是很安全的,因为hello此时是一个随机的地址,这个地址有可能会有变化,这是很危险的

编程还是要养成好习惯,把可能发成的错误消灭掉,那么上面的声明方式可以修改为这样:

char str_a[]="hello";

char* str1= str_a;

这样就是安全的方式了.

此时指针的地址,实际为str_a[0],也就是字符数组的第0个元素.char str_a[]="hello";可以看作是 char str_a[]={"h","e","l","l","o"};

对数组的元素操作的时候,以下这样的操作是相同的

for (int i =0;i<5;++i)

{

   cout << *(str1+i) << endl;

   cout << str_a[i] << endl;

}

 

 4.空指针

当声明了一个指针,但是没有具体的地址指定给它的时候,可以置空或者是0.

例如:char* p = NULL;

  char* p2= 0;

这两种都是可以的,但是此时p和p2是不可以传值的,虽然语法上是没有问题,但是不会输出任何的结果.如下:

 

 但是,可以把地址传给空指针.此时空指针只指向了被传地址的首地址,如上面的例子中str1指向的首地址是字母h的地址,也就是字符数组的首元素,str_a[0].

此时取str2和str3,会得到如下

 关于空指针先写到这里,还有一些我还未理解透彻,写本文算是做一个笔记,把自己理解的东西记录下来.

posted on 2022-03-07 15:34  破牙虫  阅读(30)  评论(0)    收藏  举报