黑马程序员-函数

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


指针是C语言中最重要的知识,如果没有学会指针,就等于没有学过C语言。

在之前我已经学过了直接引用的方法来操作变量,而在一些情况下我们用直接引用的方法不是很方便,

这时我们就要用到指针的知识,来间接操作变量。


指针定义:

格式:变量类型 *变量名;

int *a;

double *b;

 定义了指针变量a 、b。

* 是一个说明符,再定义指针时可以理解为和int为一体,不属于变量名,没有实际意义。


指针的初始化:

先定义,再初始化:

 // 定义int类型的变量a
 int a = 10;
 
 // 定义一个指针变量p
 int *p;
 
 // 将变量a的地址赋值给指针变量p,所以指针变量p指向变量a
 p = &a;
以上是指针最基本的使用方式


定义的同时进行初始化:

// 定义int类型的变量a
int a = 10;

// 定义一个指针变量p
// 并将变量a的地址赋值给指针变量p,所以指针变量p指向变量a
int *p = &a;


注意:
//定义一个指针p
int *p;
//为地址赋值
p = 1000;

以上这种为指针赋值的方式是错误的,指针只用来村地址,不能拿来存放数据


使用注意:

 1.不建议的写法, int *p只能指向int类型的数据
    int *p;
    double d = 10.0;
    p = &d;
    
2.指针变量只能存储地址
    int *p;
    p = 200;
    
3.指针变量未经过初始化,不要拿来间接访问其他存储空间
    int *p;
    printf("%d\n", *p);

4.定义变量时的*仅仅是一个象征,没有其他特殊含义
    int *p;
    p = &a;

指针的应用:


指向指针的指针:

    int a = 10;
    
    int *p = &a;
    
    int **pp = &p;
    
    // a = 20;
    
    // *p = 20;
    
    /*
    (*pp) == p
    
    *(*pp) == *p = a
    
    **pp == *p = a
    */
    **pp = 20;
    
    printf("%d\n", a);
    
    //int ***ppp = &pp;
    
    /*
    char a2 = 'A';
    char *p2 = &a2;
    (*pp) == p
    
    *(*pp) == *p = a
    
    **pp == *p = a


清空指针后,不能再间接访问其他存储空间

int a = 10;

int *p = &a;

p= null;

*p = 19; // 错误,清空指针后不能再使用

指针和数组:
 1.数组元素的访问方式
 int ages[5];
 int *p;
 p = ages;


 1> 数组名[下标]  ages[i]
 2> 指针变量名[下标] p[i]
 3> *(p + i)
 
 2.指针变量+1,地址值究竟加多少,取决于指针的类型
  int *   4
  char *  1
  double * 8

例如一下代码:

#include <stdio.h>

void change(int array[]);

int main()
{
    int ages[5] = {10, 11, 19, 78, 67};
    
    change(ages);
    
    return 0;
}

void change(int *array)
{
    printf("%d\n", array[2]);
    //printf("%d\n", *(array+2));
}

/*
void change(int array[])
{
    int s = sizeof(array);
    
    printf("%d\n", s);
}*/

void test()
{
    double d = 10.8;
    double *dp;
    dp = &d;
    
    printf("dp = %p\n", dp);
    printf("dp + 1 = %p\n", dp + 1);
    
    int ages[5] = {10, 9, 8, 67, 56};
    
    int *p;
    p = &ages[0];
    //p = ages;
    
    /*
     p ---> &ages[0]
     p + 1 ---> &ages[1]
     p + 2 ---> &ages[2]
     p + i ---> &ages[i]
     */
    
    //printf("%d\n",  *(p+2));
    
    printf("%d\n",  p[2]);
    
    /*
     for (int i = 0; i<5; i++) {
     printf("ages[%d] = %d\n", i, *(p+i));
     }*/
    
    
    //    printf("%p\n", p);
    //    printf("%p\n", p + 1);
    //    printf("%p\n", p + 2);
}


当使用void change(int array[])接收时,array前面没有*它是将数据当做一个数组接收,

如果void change(int *array)时它是将array当做一个指针,前边需要加上*

指针和字符串:

字符串::
 1.常量区
 存放一些常量字符串
 
 2.堆
 对象
 
 3.栈
 存放局部变量
 
 定义字符串的2种方式
 1> 利用数组
 char name[] = "itcast";
  * 特点:字符串里面的字符是可以修改的
  * 使用场合:字符串的内容需要经常修改
 
 2> 利用指针
  char *name = "itcast";
  * 特点:字符串其实是一个常量字符串,里面的字符是不能修改
  * 使用场合:字符串的内容不需要修改,而且这个字符串经常使用

代码展示:

int main()
{
    char name[20];
    
    printf("请输入一个字符串\n");
    
    scanf("%s", name);
    
    // 'j' 'a' 'c' 'k' '\0'
    
    //printf("%c\n", name[3]);
    
    //printf("%s\n", name);
    
    return 0;
}

void test2()
{
    char *name = "jack";
    
    //int ages[5];
    
    char *names[5] = {"jack", "rose", "jake"};
    
    char names2[2][10] = {"jack", "rose"};
}

void test()
{
    char name[] = "it";
    name[0] = 'T';
    
    //printf("%s\n", name);
    
    
    // "it" == 'i' + 't' + '\0'
    
    char *name2 = "it";
    
    char *name3 = "it";
    
    //*name2 = 'T';
    
    //printf("%c\n", *name2);
    
    printf("%p\n%p\n", name2, name3);
    
    //printf("%s\n", name2);
}


指向函数的指针:
要求:
 1.看懂语法
 2.定义指向函数的指针
    double (*p)(double, char *, int);
    p = haha;
    或者
    double (*p)(double, char *, int) = haha;
 3.如何间接调用函数
 1> p(10.7, "jack", 10);
 2> (*p)(10.7, "jack", 10);

代码:

#include <stdio.h>


double haha(double d, char *s, int a)
{
    
}

void test()
{
    printf("哈哈哈\n");
}

int sum(int a, int b)
{
    return a + b;
}

int main()
{
    int (*p)(int, int);
    
    p = sum;
    
    //int c = p(10, 11);
    
    //int c = (*p)(10, 11);
    
    int c = sum(10, 9);
    
    printf("c is %d\n", c);
    
    
    return 0;
}


void test1()
{
    void (*p)();
    
    p = test;
    
    p();
    //(*p)();
    
    //test();
}


内存问题:

指针占据的内存大小和编译器有关,

32位编译器环境下占据4个字节,也就是32个比特位
64位编译器环境下占据8个字节,也就是64个比特位

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值