黑马程序员--IOS基础第十一天(C语言)


  1. 数组指针:用一个指针变量指向一个数组元素,就是数组指针

      作用:使用数组指针间接访问数组元素

    注意:(1)数组名a不代表整个数组,值代表数组首元素的地址

         2”p=a“的作用是a数组的首元素的地址赋给指针变量p“。而不是把数组a各元素的值赋值给p“

2. 在指针指向数组元素时,允许进行以下运算:

 ++=

--=

自加,

自减,

两个指针相减(只有p1p2都指向同一数组中的元素时才有意义)

  1. 数组指针的初始化:

int a[4]={1,2,3,4};

  int *p = a;  //数组指针,定义了一个指针变量p赋值数组的首地址(第一个元素的地址),p指向数组的第一个元素

     int *p = &a[0]; //等价上面一句话

   数组指针如何访问数组的元素:

     1p+1   表示指向数组的下一个元素

     2p-1   指向数组的上一个元素

注意:数组名a是一个常量,数组名 a是一个常量相当于 *(10++)这是错误的

       //printf(" *a++   =%d\n",*a++); //错误的

  1. 结论:引用一个数组元素,可用下面两种方法:

  1. 下标法,a[i]形式

  2. 指针法,如*a+i)或*p+i

  3. a是常量(a++错误),p是变量(p++正确)

4. 指针数组:

       存放指针的数组,就是指针数组

  指针数组的定义:

  数据类型  * 数组名[数组长度];

       int *pa[3];

       //定义了一个指针数组,数组名是pa,可以用来存放3个指针(必须是int类型变量的指针)

  指针数组的使用:

       int a=3,b=4,c=5;

       int *pa[3]={&a,&b,&c};

       pa[0] a的地址

      pa  数组首地址,又是变量a的地址

5. 两个指针变量之间的运算

 

   1)两个指针之间的减法运算:两指针变量相减所得只差是两个指针所指数组元素之间相差的元素个数。

       10x0006  - 0x0003  =  3  (意义不大)

       2)常见的用法:两个指针都指向同一个数组

            i.判断两个指针变量指向的元素是否连续

            ii.判断两个指针变量之间相隔几个元素

 地址差值(p1-p)*sizeof(int)

            int a[5]={1,2,3,4,5};

            int *p = a; //p指向了数组的第一个元素

            int *p1 = &a[3]; //p指向了数组的第四个元素

            注意:两个指针变量之间没有加法运算

如果两个指针变量指向同一个元素 那么他们相减的结果是 0

判断两个指针变量指向的元素是否相邻(连续),他们相减的结果是 1的绝对值

2)两个指针之间的关系运算

p1 > p

    //1    表示p1在高位

    //0    p在高位或者他们指向了同一个位置

6. 数组名访问二维数组

#include <stdio.h>

 

int main(int argc, const char *argv[]) {

   

   int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

   

   //列指针

   //a[0] == &[0][0] a[0]+1==&a[0][1]  a[0]+2==&a[0][2]

   printf("&a[0][1] = %p\n",&a[0][1]);

   printf("a[0]+1   =%p\n",a[0]+1);

   printf("*(a[0]+1)   =%d\n",*(a[0]+1));  //3

   

   

   printf("&a[0][2] = %p\n",&a[0][2]);

   printf("a[0]+2   =%p\n",a[0]+2);

   

   //行指针  a[0]  a[1] a[2]

   //a+1    //第二行的首地址

   //a+2    //第三行的首地址

    printf("a[1]   =%p\n",a[1]);

    printf("a+1   =%p\n",a+1);

   

    printf("a[2]   =%p\n",a[2]);

    printf("a+2   =%p\n",a+2);

   

    // a+1 第二行第一个元素的地址

    //*(a+1)  == &a[1][0]

   

   printf("*(a+1) = %p\n",*(a+1));

   printf("&a[1][0] = %p\n",&a[1][0]);

   

   

   //a[i]+j     获取的&a[i][j]

   //*(a[i]+j)  获取 a[i][j]

   //a[i]      *(a+i)

   //*(*(a+i)+j); ----->  a[i][j]

   for (int i=0; i<3; i++) {

        for (int j=0; j<4; j++) {

            //a[i]    *(a+i)

           //printf("%d\t",*(a[i]+j));

           printf("%d\t",*(*(a+i)+j));

        }

       

        printf("\n");

   }

   

   return 0;

}

7. 数组指针:

   定义一个指针变量,让这个指针变量指向一维数组的元素

 二维数组指针

  行指针,用来指向二维数组的每一行,存放的是行的首地址

    定义格式:  数据类型  (*行指针变量名)[数组第二维的长度]; 

 二维数组指针的初始化

  int a[2][3];

  int b[2][2];

  float f1[4][4];

  //假设我要定义一个指向数组a的一个行指针

  // a  = &a[0]  = &a[0][0]  = a[0]

  int (*p)[3] = a;

 二维数组指针的使用

*(*(p+i)+j)  //就是获取二维数组的每个元素

8.指针数组和二维数组指针变量的区别:

 二维数组指针变量是单个变量,其一般形式中*指针变量名)两边的括号不可少。而指针数组类型表示的是多个指针(一组有序指针)在一般形式中“*指针数组名两边不能有括号。例如:

 Int*p[3]

表示一个指向二维数组的指针变量。该二维数组的列数为3或分解为一维数组的长度为3.

Int *p[3]

表示p是一个指针数组,有三个下标变量p[0], p[1], p[2],均为指针变量

9. 字符串指针:

        定义: char *字符串指针变量名 ="字符串内容";

       用作:用来保存一个字符串

       注意:1)字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的,只能按对指针变量的赋值不同来区别。对指向字符变量的指针变量应赋予该字符变量的地址。

 2)使用字符数组来保存的字符串是保存栈里的,保存栈里面东西是可读可写,所以我们可以改变里面的字符当把一个字符串常量赋值给一个字符数组的时候,那么它会把字符串常量中的没有字符都放在字符数组里

3)使用字符指针来保存字符串,它保存的是字符串常量地址,常量区是只读的,所以我们不可以修改字符串中的字符

10.二维字符串数组:

    一维字符数组

       char ch[10]={'a','b'};

       char ch1[]="abc";

   二维字符数组

       char ch2[3][10]={{'a','b'},{'b'},{'c'}};

   用二维数组来保存多个字符串

      //用二维的字符数组可以存储多个字符串

       //第一维存的是每个字符串的首地址

       //每个字符串的长度,不能超过第二维长度

       charch3[3][5]={"abc","def","kkkk"}

           a b  c  \0  \0

           d e  f  \0  \0

           k k  k  k   \0

          ch[1][3] = 'Z';

11. #include <stdio.h>

int main(int argc, const char *argv[]) {

   //char 类型的指针数组

   char*name[3]={"abcdasfadsfasdfasdfasdf","def","kkk"}

   for (int i=0; i<3; i++) {

        //name[i]

        printf("%s\n",*(name+i));

   }

   //字符串指针和字符数组的区别

   //字符串指针:

                      char *ss ="abc";

   //指向可以改变

   //ss是一个指针变量

                      ss ="helloWorld!";

   //字符数组:

                      chars1[]="abc";

   //s1是数组名,是一个常量,不能被复制

                      //s1 ="helloworld!";

   return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值