20190327-C语言学习 (指针复杂定义声明 | 指针类型与运算)

本文详细介绍了C语言中指针的使用,包括指针的好处、复杂指针声明的解析、指针类型与运算,以及如何逆序字符串。通过右左法则解析复杂的指针声明,探讨指针的运算如相加、相减和大小比较,是学习C语言指针的好资料。
摘要由CSDN通过智能技术生成

目录

1. 使用指针的好处

2. 一些复杂指针声明

一些容易混淆的定义(根据优先级还判断)

使用右左法则

3. 指针类型与运算

指针的运算

指针与指针相减

指针大小比较

4. 逆序一个字符串


1. 使用指针的好处

(指针像是对一段范围内存的访问,可以直接操作内容)

2. 一些复杂指针声明

指针概念难学,并且容易与其他东西混淆

  • 指针是一个类型

     
    (1级中是后缀的自增与自减,2级是前缀的)

     S:数组,H 函数,E 结构体   *&星宇

一些容易混淆的定义(根据优先级还判断)

*p++           ++的优先级高于*,先算p++再取值

&p++          同理++的优先级高于&,先算p++再取地址

&stu.a       .  的优先级高于&,先获得stu的成员变量,再取a的地址

int *a[10]     []数组下标的优先级最高,a是一个长度为10的数组,数组中每个元素是一个指针,是指向整型的指针 【指针数组】

int (*a)[10]   从左到右的顺序,先算(*a)是一个指针,是一个指向长度为10的整型数组的指针【数组指针】

int *f(int)      f是一个函数,函数的类型是函数的返回值,返回值是指向int的指针,是一个【指针函数】

int (*f)(int) 是一个函数指针,函数的类型是int【函数指针】

int *(*f)[10]  (*f)是一个指针,int *  [10] 剩下的部分就是在修饰指针的,指针指向的数组,数组元素是int型的指针

int *(*(*f)(int))[10]   

        (*f) 是一个指针 

        (*f)(int) 是一个函数指针,形参是int

        (*(*f)(int))返回值是一个指针

        int *  [10]   返回值指针是一个指向int型指针数组的指针

使用右左法则

一层一层往外剥离

int (*(*f)(int,int))(int)

(*f)(int,int) : f是一个函数指针,参数是两个int类型

(*(*f)(int,int)) 返回值是一个指针

int   (int) 修饰返回值的指针的:返回值的指针类型是一个函数指针,形参是int 返回值是int

 

3. 指针类型与运算

 

类型:一组数值与对这些数组的操作(感觉这个很抽象呢!)不同类型有不同的操作,例如char和float的区别

指针的运算

上图分别是char short int

p+1 == p+1*sizeof(type) 单位是byte

指针与指针相减

表示两个指针在内存中距离,以sizeof(type)为单位,不是以byte为单位

注意两个指针类型一定要一致

指针大小比较

在链表中很常见呢,遍历之类的

4. 逆序一个字符串

strlen有没有包括最后一个'\0'字符呢?

#include "stdio.h"
#include "string.h"
int main(void){
    char a[20],tmp;
    printf("input string:\n");
    gets(a);

    char *p,*q;
    p=q=a;
    p+=strlen(a)-1;
    while(q<p){
        tmp = *q;
        *q++ = *p;
        *p-- = tmp;

    }
    puts(a);
    return 0;
}

        tmp = *q;
        *q++ = *p;
        *p-- = tmp;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值