黑马程序员——C语言笔记之指针

------- android培训java培训iOS培训.Net培训、期待与您交流! ----------

指针概念:

内存单元的编号也叫做地址。根据内存单元的编号或地址可以找到所需的内存单元,所以通常把这个地址称之为指针。

生活中实例:

银行账号是指针,卡里的钱是实际内容。

使用指针的好处:

  1. 为函数提供修改及调用变量的灵活手段
  2. 让函数有多个返回值
  3. 改善某些子程序的效率(传递的是一个地址而不是内容)
  4. 为动态数据结构(如二叉树、链表等)提供支持

指针是一个地址,是一个常量。

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

定义格式:类型说明符 *变量名 = 地址;

指针也可以被声明为全局、静态局部和局部的。

指针的应用场景:1)在被调函数中可以修改主调函数中的变量的值。2)让函数可以有多个返回值。

#include <stdio.h>

void caculator(int x,int y,int *add,int *jian,int *cheng,float *chu){

    //在函数的内部访问了主调函数中的变量值
    *add = x+y;
    *jian = x-y;
    *cheng = x*y;
    *chu = x/(float)y;
    <pre name="code" class="plain">//用指针让函数可以有多个返回值,并不是有多个return
}int main(int argc, const char * argv[]) { int add=0; int jian=0; int cheng=0; float chu=0.0f; caculator(12, 4, &add, &jian, &cheng, &chu); printf("add = %d\n",add); printf("jian = %d\n",jian); printf("cheng = %d\n",cheng); printf("chu = %.2f\n",chu); return 0;}

 

二级指针概念:

如果一个指针变量存放的又是另一个指针变量的地址,则成这个指针变量为指向指针的指针变量,也称之为二级指针。

int a=10;
int *p=&a;//定义一个一级指针
int **p1=&p;//定义一个二级指针
printf("%p",&p);   //p的地址
printf("%p",p1);   //p1的内容,p的地址
printf("%p",*p1);  //p的内容,a的地址
printf("%d",*p);   //a的内容
printf("%d",**p1); //a的内容
在64位编译器中,任意指针变量都占用8个字节。

void *p; //可以将其强制转换成任意类型的指针


指针与数组

数组指针:

用一个指针变量指向一个数组元素,则它就是数组指针。

对于一个一维数组来说
        int a[5];

      1)获取 a[i]的地址有三种方法
          (1)&a[i] 

          (2)a+i   

          (3) int *p = a;
               p+i;
      2) 获取 a[i]的值有四种方法
         (1)a[i]         
         (2)*(a+i)
         (3) int *p = a;
              *(p+i);
         (4)*(&a[i])

数组指针的应用:逆序数组

#include <stdio.h>
/**
 *  逆序一个数组
 *
 *  @param a   数组名
 *  @param len 数组长度
 */
void nixuArray(int a[],int len){

    //定义数组指针
    int *p = a;
    
    //定义下标
    int i = 0,j = len-1;
 
    int temp;
    while (i<j) {

        //交换a[i]  和 a[j];
        temp = *(p+i);
        *(p+i) = *(p+j);
        *(p+j) = temp;
        
        //修改下标
        i++,j--;  
    }
}

int main(int argc, const char * argv[]) {
    
    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    //调用函数逆序数组
    nixuArray(arr, 10);
    //遍历数组
    for (int i=0; i<10; i++) {
        printf("%d\t",arr[i]);
    }
    return 0;
}

二维数组指针

格式:数据类型 (*指针变量名)[二维数组列数]; 

p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 

int a[3][4];

int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。

p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]

数组指针也称指向一维数组的指针,亦称行指针,每次加i都是移动一行的地址的大小,而非移动一个元素的地址大小 


一维指针数组

概念:一个数组的元素值为指针则为指针数组

格式:类型说明符 *数组名[数组长度]


指针数组和二维数组指针的区别

指针数组:
int *pa[3]={&a,&b,&c}; // int *pa[3]={a[0],a[1],a[2]};
指针数组类型表示的是多个指针(一组有序指针),两边不能有括号。
二维数组指针:
int (*pa)[3];
二维数组指针变量是单个的变量,括号不能少。
int *p[3]; //表示p是一个指针数组,有三个下标变量p[0]、p[1]、p[2]均为指针变量
int (*p)[3]; //表示一个指向二维数组的指针变量。该二维数组的列数为3或分解为一维数组的长度为3


指针与字符串
字符串指针

char *变量名="字符串内容"; 

char *s="C Language";   则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。 

二维字符串指针

char st[3][6]={"china","japan","korea"}; 


指针与函数
指针函数

在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称之为指针型函数。
指针函数的定义:
      指针类型 * 函数名(){
 
          return 地址;
      }

函数指针

在C语言中,一个函数总是占用一段连续的内存区,而函数名就是其首地址,指向函数的指针变量称之为函数指针变量。
函数指针变量的定义
      返回值类型  (*变量名)(函数的参数);
函数的声明:
      int sum(int a,int b);----> 函数指针 int (*p1)(int a,int b);
      定义了一个函数指针 p1 
      p1可以存放返回值是int类型,并且有两个形参,形参的类型还都是int类型的函数的地址
函数指针的初始化
      p1 = sum;  //sum存的就是函数在内存中的首地址
#include <stdio.h>

int sum(int x,int y){
    return x+y; 
}

int jian(int x,int y){
    return x-y;  
}

int cheng(int x,int y){
    return x*y;
}

int chu(int x,int y){
    return x/y;
}

int main(int argc, const char * argv[]) {
    
    //函数指针的使用
    //1、定义函数指针
    int (*p)(int ,int );
    //2、给函数指针初始化
    p = sum;  //p也指向了sum函数
    
    switch (3) {
        case 1:
            p = sum;
            break;
        case 2:
            p = jian;
            break;
        case 3:
            p = cheng;
            break;
        case 4:
            p = chu;
            break;
            
        default:
            break;
    }
    
    //3、用函数指针间接的调用函数
    //     (*p)(23,45);
    int s = p(23,45);

    printf("%d\n",s);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值