3.23指针进阶

1.指针可以指向字符串 本质是存了字符串首字符的地址

 

ps和arr放的都是h的地址

printf("%s/n,ps);

printf("%s/n,arr);

第一个为else成立 str1 str2放的都是字符串hello bit. 指向的都是h的地址

第二个为if成立        str3,str4放的一样 但是他俩的字符串是常量字符串是不能改的

 str1 str2指向两个字符串 只不过都一样

        str3str4指向的是一个

指针数组

int*arr【3】存放整形指针的数组

这样可以打印出所有元素

 printf("%d',*(arr[i]+j));

printf("%d",arr[i][j]);

等价

数组指针

是一种指针 指向数组的指针

int a=10;

int *pa=&a;

char ch='w';

char*pc=&ch;

double*d[5];

double*(*pd)[5]=&d;

                        //int arr[10]={1,2,3,4,5};

                        //arr数组名是首元素地址 arr[0]的地址

                        //&arr取出的是数组的地址

                        //int *(parr)[10]=&arr;        //parr就是一个数组指针 其中存放的是数组的地址

&数组名vs数组名

        int arr[10]={0}; 

        printf("%p\n,"arr);

        printf("%p\n,"&arr);        //结果一样 但是意义不同

                        

        int*p1=arr;        //整形指针

        int(*p2)[10]=&arr;        //数组指针

      printf("%p\n",p);

        printf("%p\n,p1+1);        //p1是整形数组+1跳过4个字节

        printf("%p\n",p2);

        printf("%p\n,p2+1);        //p2+1跳过一个数组

 前两行相差4

后两行相差2和8即40 40也是数组10个元素的总大小

 

情况2数值相同而已 

int arr[3][5]={{1,2,3,4,5},{2,3,4,5,6},[3,4,5,6,7}}

void print2(int(*p)[5],int r,int c)

{

        int j=0;

        int j=0;

        for(i=0;i<r;i++)

                {

                        for(j=0;j<c;j++)

                        {

                               打印 *(*(p+i)+j);                //p指向位置如图 p+1指向arr[1]位置 通过加I可以选行

                        }                                                //*(p=i)选行 +j选列

                }                                                        //p是一整行的首元素一次直接跨过一行 解引用之后                                                                        加j只跨过一个元素

}

parr1 此数组意义为整形指针 每个数组元素都是地址 即每个元素类型是int*

parr2是数组指针 该指针能够指向一个数组数组元素有十个每个元素的类型是int

parr3 parr3是一个存放数组指针的数组 该数组能存放10个数组指针 每个数组指针能指向一个数组数组五个元素 每个元素是int类型

数组参数 指针参数

一位数组传参

  

 前两个函数传参 可以写成test(arr) 也可以写成test(arr2)

传入void test(int*arr) 也可以用test(arr) 因为是把数组首元素地址传过去了 符合int*

一维数组传参 数组可忽略元素值 可以传地址

三种形式都行 

arr2存放int*的指针符合 test2(arr2)符合

 

类比test1和arr1 test2(arr2)取出来arr2首元素地址 首元素本身是int* 则取出来的是二级指针 符合 

二维数组传参

 

行可省略 列不能省略

 

直接用test(arr)传的是首元素的地址是第一行的地址(二维数组可以分成行元素 首地址就是第一行的元素)是一维数组一整行的地址 但是要求的是一个元素的地址所以不行

也不行 要求参数是 一位数组 更不行

行  参数要求是能指向五个元素的数组指针 符合要求

不行 传过去的不是二阶指针  是第一行的地址

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值