c语言进阶——二、指针的进阶

回顾:

指针的概念:

1.指针是一个变量,用来存放地址

内存会划分为小的内存单元

每个内存单元都有一个编号

这个编号就被称为地址,把地址也叫指针

内存编号=地址=指针

指针或者地址可以存放到指针变量中

2.指针的大小是固定的4/8个字节

3.指针有类型,决定了指针加减整数的步长

————————————————————

1.字符指针

//常见用法
int main()
{
    char ch='w';
    char* pc=&ch;
    *pc='a';
    printf("%c\n",ch);
}
int main()
{
    const char* p="abcdef";//把abcdef字符串a的地址存到p里,加const防止修改
    printf("%c\n",*p);//打印a
    printf("%s\n",p);//abcedf
}
int main()
{
    const char* p1="abcdef";
    const char* p2="abcdef";
    char a1[]="abcdef";
    char a2[]="abcdef";
    //p1==p2,a1!=a2(不加const也一样)
}

2.指针数组

存放指针的数组

int main()
{
    int* arr[10];//存放整形指针的数组 
    char* ch[5];//存放字符指针的数组
    int a=10;
    int b=20;
    int c=30;
    int* arr[3]={&a,&b,&c};//arr就是一个指针数组
    for(int i=0;i<3;i++)
    {
        printf("%d ",*(arr[i]));
    }
}

常见用法:

1.相当于模拟一个二维数组

int main()
{
    int arr1[5]={1,2,3,4,5};
    int arr2[5]={2,3,4,5,6};
    int arr3[5]={3,4,5,6,7};
    int* parr[3]={arr1,arr2,arr3};
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<5;j++)
        {
            printf("%d ",parr[i][j]);//或者*(parr[i]+j)
        }
        printf("\n");
    }
}

3.数组指针

3.1定义:

是指针

指向数组的指针

int* p1[10];//p1是数组,指针数组
int(*p2)[10];//p2是一个指针,指向一个数组
int main()
{
    int a=10;
    int* p=&a;
    int arr[10]={0};
    printf("%p\n",arr);//同
    printf("%p\n",arr+1);//+4
    printf("%p\n",&arr[0]);//同
    printf("%p\n",&arr[0]+1);//+4
    printf("%p\n",&arr);//三个值相同
    printf("%p\n",&arr+1);//+40
    int (*p)[10]=&arr;
    //p是一个指针,指向了数组,所以p叫数组指针
    //该数组指针类型int (*)[10]
}

数组名该怎么理解呢?

通常情况下我们说的数组名都是数组首元素的地址

但是有2个例外

1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小

2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址

___数组指针有什么用?

一维数组打印:

void print(int(*p)[10],int sz)
{
    int i=0;
    for(i=0;i<sz;i++)
    {
        printf("%d ",*(*p+i));
    }//*p相当于数组名,数组名又是首元素地址所以*p就是&arr[0]
    printf("\n");
}
int main()
{
    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    //写一个函数打印arr数组的内容
    print(&arr,10);//把数组的地址传过去
}

二维数组的打印

void print(int (*p)[5],int c,int r)
{
    int i=0,j=0;
    for(i=0;i<c;i++)
    {
        for(j=0;j<r;j++)
        {//p+i是指向第i行的
        //*(p+i)相当于拿到了第i行,也相当于第i行的数组名
        //数组名表示首元素的地址,*(p+i)就是第i行第一个元素的地址
          printf("%d ",*(*(p+i)+j)) ; 
        }
        printf("\n");
    }
}
int main()
{
    int arr[3][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};
    print(arr,3,5);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值