黑马程序员—关于对指针的理解

MJ老师说过没学好指针 等于没学C语言。c语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是c语言的灵魂,一点都不为过。C中函数调用是按值传递的,指针所做的是地址的传递。(*p)操作是返回p 的值作为地址的那个空间的取值。(&p)则是这样一种运算,返回当时声明p 时开辟的地址。


一、指针变量的定义

1. 格式:变量类型 *指针变量名;

2. 举例:int *p;   char *p2;

3. 注意:定义变量时的*仅仅是指针变量的象征

4. 指针变量只能存储地址

5. 指针就一个作用:能够根据一个地址值,访问对应的存储空间

6. 指针变量p前面的int:指针变量p只能指向int类型的数据

7. 指针变量未经过初始化,不要拿来间接访问其他存储空间

8. 任何指针都占用8个字节的存储空间



二、利用指针变量简单修改其他变量的值

1.指向某个变量

int a;

int *p;

p = &a;

或者

int *p = &a;


2.修改所指向变量的值

*p = 10;


3.在函数内部修改外面变量的值

int a = 10;

change(&a);


void change(int *n)

{

    *n = 20;

}


4.指向指针的指针

int a = 10;


int *p = &a;


int **pp = &p;


三、指针与数组

1.将数组当做函数参数传入时,会自动转为指针

1.数组元素的访问方式

int ages[5];

int *p;

p = ages;

1> 数组名[下标]  ages[i]

2> 指针变量名[下标] p[i]

3> *(p + i)


2.指针变量+1,地址值究竟加多少,取决于指针的类型

int *   4

char1

double * 8

指针在内存中的存储方式

// 0000 0000 0000 0000 0000 0000 0000 0010

    int i = 2;

    // 0000 0001

    char c = 1;


利用一个指针来接收一个数组,指针变量指向了数组的首元素,数组名就是数组的地址,也是数组首元素的地址


四、指针与字符串

1.定义字符串的2种方式

1> 利用数组

char name[] = "itcast";

* 特点:字符串里面的字符是可以修改的

* 使用场合:字符串的内容需要经常修改


2> 利用指针

char *name = "itcast";

* 特点:字符串其实是一个常量字符串,里面的字符是不能修改

* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用


2. 计算一个字符串的字符个数

int string_len(char *s)

{

    // 记录字符的个数

    int count = 0;

    

    // 如果指针当前指向的字符不是'\0'

    while ( *s != '\0')

    {

        // 个数+1

        count++;

        

        // 让指针指向下一个字符

        //s = s + 1;

        s++;

    }

    return count;

}


3.定义字符串数组

1> 利用二维字符数组

char names[2][10] = {"jack", "rose"};


2> 利用指针数组

char *names[2] = {"jack", "rose"};


五.指向函数的指针

定义:

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);


int (*p)(int, int);

// 定义指针变量指向sum函数

// 左边的int:指针变量p指向的函数返回int类型的数据

// 右边的(int, int):指针变量p指向的函数有2int类型的形参

p = sum;

int c = (*p)(10, 11);

printf("c is %d\n", c);


     特例没有返回值的函数

     void (*p)();

// (*p)是固定写法,代表指针变量p将来肯定是指向函数

// 左边的void:指针变量p指向的函数没有返回值

// 右边的():指针变量p指向的函数没有形参

void test()

{

    printf("调用了test函数\n");

}

p = test;  // 指针变量p指向了test函数

p(); // 调用函数等同于test();


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值