黑马程序员——C语言——指针

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

1. 什么是指针?

指针就是地址,对一个内存单元来说,单元的地址即为指针,其中存放的数据是单元的内容。

变量的存取方式有两种:a. 直接存取——通过变量名存取

                                       b. 间接存取——通过地址(指针)存取


2. 指针变量——存放指针(地址)的变量

注意事项:1. 指针是一个地址,是常量

         2. 指针变量存放地址,是一个变量


指针变量的定义:  

类型名  *变量名;    eg: int *p;  //p是一个指针变量,存放int类型变量的地址


指针变量注意事项:

  1. 定义指针变量时,“*”必须有,没有就相当于定义一个普通变量
  2. 不能用指针变量存放数值或字符
  3. 指针变量也是变量,有全局和局部之分


3. 指针变量的初始化:

  1. 定义的同时初始化

      eg: int a = 3;

 int *p=&a; //指针变量p指向a

    int *p1 = &a, *p2 = &a;

b. 先定义后初始化

    eg: int *pointer;

pointer=NULL;   //此种方式最好不用,会造成野指针

c. 定义一个变量但不指向

eg: int *pointer=NULL;


注意事项:a. 多个指针可以指向同一个地址

                  b. 指针可以改变指向

       c. 指针如果没有初始化,里面存放的是垃圾值,称为野指针


4. 指针变量的引用

使用“*”获取指针变量对应的存储单元    eg: *p = 100;  //指针变量p指向的变量被赋值100

   value = *p; //引用指针变量给value赋值100


指针使用实例代码

/**
 *用指针实现交换两个变量的值
 */

#include <stdio.h>
void exchange(int *p1,int *p2){
    //交换p1,p2两个地址中的内容
    int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}
int main(int argc, const char * argv[]) {
    int a=5,b=7;
    exchange(&a, &b);
    printf("a=%d\tb=%d",a,b);
    return 0;
}

二级指针:指针变量指向指针

    int c=5;
    int *p=&c;  //p是一个一级指针
    int **p1=&p;  //p1是一个二级指针

数组指针:指向数组元素的指针

数组指针的作用:使用数组指针间接访问数组的元素

数组元素的初始化:

int a[2]={1,2};

int *p=&a;  //p指向数组的第一个元素


数组指针和数组名的区别:

p是一个指针变量,它存放的值是可以改变的,*p++是可以的,而数组名是一个常量,不能进行自增或自减


使用指针把数组逆序的示例代码:

#include <stdio.h>
void changeArr(int a[],int len){
    //数组指针指向数组a
    int *p=a;
    //循环把前后对应位置的元素值交换
    for (int i=0; i<=len/2; i++) {
        int temp;
        temp=*(p+i);
        *(p+i)=*(p+len-i-1);
        *(p+len-i-1)=temp;
    }
    
}

int main(int argc, const char * argv[]) {
    int a[5]={1,2,3,4,5};
    changeArr(a, 5);
    for (int i=0; i<5; i++) {
        printf("%d\t",a[i]);
    }
    
    return 0;
}


一维指针数组

指针数组:数组元素的值是指针

一维指针数组的定义

类型说明符  *数组名[数组长度]   eg:int *p[3];

指针数组的使用举例:

int a=3, b=4, c=5;

int *p[3]={&a, &b, &c};

通过数组元素访问a的值如下:

printf("a=%d\n",*p[0]);

通过数组名访问a的值如下:

printf("a=%d\n",**p);

二维数组指针的定义

数据类型 (*指针变量名)[二维数组的列数]

eg: int (*p1)[4];

二维数组指针的初始化

int a[2][3]={0,1,2,3,4,5};

int (*p)[3]=a;//定义一个指向数组a的行指针

二维数组指针的引用——*(*(p+i)+j)  //获取二维数组的每一个元素

 for (int i=0; i<2; i++) {
            for (int j=0; j<3; j++) {
//输出二维数组的每一个元素
                printf("a[%d][%d]=%d\n",i,j,*(*(p+i)+j));
            }
        }

一维指针数组和二维数组指针的区别:指针数组表示的是多个指针,二维数组指针变量是一个单个变量



字符串指针——指向字符串

定义格式:char  *变量名="字符串内容"; //字符串指针指向字符串

 char *p1= &ch;   //字符指针

根据赋值的类别来区分是字符指针还是字符串指针。


char *str="abc";把字符串常量的首地址(即第一个字符的地址)赋值给了指针变量。  //abc保存在常量区,而str只保存了字符串常量的首地址


注意:使用字符数组保存的字符串保存在栈区,保存在栈区里的内容是可读可写的;使用字符串指针保存字符串时,字符串是保存在常量区,保存的是字符串常量的首地址,常量区的内容是不可以修改的。


读取字符串量的每个字符的示例代码:

#include <stdio.h>
#include <string.h>

int main(int argc, const char * argv[]) {
    //定义一个字符串指针,指针保存字符串首地址
    char *str="Hello susie!";
    //循环遍历字符串的每一个字符
    for (int i=0; i<strlen(str); i++) {
        printf("%c",*(str+i));
    }
    return 0;
}


  1. 什么是指针?

指针就是地址,对一个内存单元来说,单元的地址即为指针,其中存放的数据是单元的内容。

变量的存取方式有两种:a. 直接存取——通过变量名存取

                                       b. 间接存取——通过地址(指针)存取


2. 指针变量——存放指针(地址)的变量

注意事项:1. 指针是一个地址,是常量

       2. 指针变量存放地址,是一个变量


指针变量的定义:  

类型名  *变量名;    eg: int *p;  //p是一个指针变量,存放int类型变量的地址


指针变量注意事项:

  1. 定义指针变量时,“*”必须有,没有就相当于定义一个普通变量
  2. 不能用指针变量存放数值或字符
  3. 指针变量也是变量,有全局和局部之分


3. 指针变量的初始化:

  1. 定义的同时初始化

      eg: int a = 3;

 int *p=&a; //指针变量p指向a

    int *p1 = &a, *p2 = &a;

b. 先定义后初始化

    eg: int *pointer;

pointer=NULL;   //此种方式最好不用,会造成野指针

c. 定义一个变量但不指向

eg: int *pointer=NULL;


注意事项:a. 多个指针可以指向同一个地址

                  b. 指针可以改变指向

       c. 指针如果没有初始化,里面存放的是垃圾值,称为野指针


4. 指针变量的引用

使用“*”获取指针变量对应的存储单元    eg: *p = 100;  //指针变量p指向的变量被赋值100

   value = *p; //引用指针变量给value赋值100

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值