黑马程序员-C语言指针

本文介绍了C语言中的指针概念,通过示例展示了指针如何赋值、打印及使用。讲解了指针不可修改字符串常量的特性,并探讨了指针在数组和函数返回值中的应用。
摘要由CSDN通过智能技术生成

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


0.指针概念
指针分类:
   (1)强指针:默认情况下,都是强指针(__strong)
   (2)弱指针: __weak 修饰  
                  eg: __weak Person *p2 = p ; (p2就是个弱指针)

指针:指针是一个地址,我们可以通过获取地址来操控此地址中存储空间的值。
举例:地址就类似房间门牌号,我们可以通过某个房间的门牌号来获取此房间住的什么人,也就是说获取地址存储空间的内容;或者让什么人住进此门牌号的房间,也就是更改地址的存储空间内容。
指针变量:存放地址的变量。

1.指针变量
    作用:只能存放地址( 指针变量占用8个字节存储空间),能够根据地址值访问存储空间,并修改存储空间的值。
    *p代表访问p的存储空间(p是指针 )
    int *p;
    p=&a;//代表指针p存储变量的a地址  指针变量p指向a

2.指针访问的空间大小。
    指针访问的空间大小只与指针的返回值有关,和变量没关系。
    eg: char a='A';
          int *p=&a;
 代表指针p访问的空间大小为4个字节。

 p=p2;//代表指针p2的地址复制给指针p,指针p将指向指针p2所指向的存储空间

3.指针和数组
 3.1 内存区分部分:
    常量区:存放一些常量字符串,会将结果缓存,结果无法更改。
     堆:存放对象,需要自己创建对象。类似我们自己做菜炒饭。
    栈:存放局部变量 ,直接调用程序中有的。类似在酒店点菜吃饭,不需要自己做
    静态区:存放全局变量和静态变量。

 3.2 指针与数组
    我们可以通过指针操作数据。
  eg:
    ag[]={4,5,6,7,8};
    int *p=&ag[0]; // 或者p=ag;
   /* 
    p-->&ag[0]
    p+1 -->&ag[1]
    p+2 -->&ag[2]
    p+i -->&ag[i]
    */
    指针加1 代表指针指向下一个数组地址( 1具体的字节数取决指针类型,eg:int类型就加4,char类型就加1)。
  
  数组元素的访问方式:
      1>数组名[下标]   ages[i]
      2>指针名[下标]    p[i]
      3>*(p+i)

4.指针与字符串

 4.1.定义字符串的两种方式
    4.1.1利用数组定义:
 char name[]="itcat";
 char name2[]="itcat";//开闭新的内存存储空间
  特点 :字符串里的字符可以修改。 //此值放在栈内,属于字符串变量
 使用场合:字符串内容需要经常修改。

    4.1.2 利用指针:
 char *name="itcast";
 char *name2="itcast";// 使用*name的存储空间,不会新增存储空间,指针name2指向第一个字符的地址,既字符i的地址
 特点:字符串其实是一个常量字符串,里面的字符无法修改、 //因为此值放在常量区内,会将此值缓存,属于字符串常量
 使用场合:字符串内容不需要修改,且字符串内容要经常使用

eg1:
  
[cpp]  view plain copy
  1. char *name1 = "abc";  
  2.        *name1 ='A';//指针name1所指向的存储空间的值无法进行修改  
  3.        printf("%s",name1);//不能打印出来  


 eg2:  
    
[cpp]  view plain copy
  1. int main()  
  2.     {  
  3.      char *name="asd";  
  4.      printf("%s\n",name); //从name的第一个地址开始输出,直到遇到\0后就停止输出。  
  5.     //printf("%c\n",*name);//输出指针所指向的一个字符。  
  6.     }  

eg3:
[cpp]  view plain copy
  1. char a[6];  
  2. a="asd";  


以上代码错误,因为a是个常量,且值是指向a[0]的地址的存储空间值,无法进行修改。

eg4:
[cpp]  view plain copy
  1. char *p="asd";  
  2.          *p="ddd";  


以上代码也错误,有两个错误:
          1>因为指针p的返回值是char型,只能赋值字符型,而*p="ddd",代表将字符串赋值给p,因此错误。
          2>char *p="asd"; 代表定义的是字符串常量,常量不能被更改。

5.指针与函数 
   5.1 指向函数的指针
    int (*p)();//代表指针p指向一个函数,函数的返回值是int类型
eg1:
    void (*p)();   // 指针名p 指向一个函数
     p=test;//test是函数名  ,函数名就相当于地址(整个函数的入口)
     (*p)();//调用指针所指向的存储空间

  调用方法:
    1>    (*p)();//调用指针所指向的存储空间
    2> test(); // 直接使用函数名调用

 5.2 返回指针的函数
     int *test();  //代表test函数返回的是指针(也就是返回地址)

 eg:
[cpp]  view plain copy
  1.  // 定义一个返回指针的函数  
  2.  int *test(int n1,int n2)  
  3.  {  
  4.    return n1-n2;  
  5. }  



6.清空指针
  • p = 0;
  • p = NULL;

7.数组指针和指针数组
 指针数组是指针的数组,里边的内容是指针;
   eg: int *p[4];  // 指向4个int类型的指针
 数组指针是指向数组的指针,具体一点是指向数组的第一个元素,指针每加一便指向数组的下一个元素

8.int const *p 和 int *const p的区别
   int const *p : 1> const修饰的是*p,因此*p 是常量,不能通过*p 修改p所指向的存储空间的值
                         2>P是变量,可以被赋值,p所指向的地址可以变化。
   int *const p:1>p是常量,其所指向的地址不能变化。
                          2>*p 是变量,其所指向的存储空间的值可以变化


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值