学习嵌入式的第十四天---指针操作一维字符型数组

指针操作一维字符型数组

char s [ ]="hello";

char *p=s;  推导过程 和一维整形数组相同

int puts( const  char *s);

void puts(char s [ ] );

void puts (  const  char  *s);

{

   输出字符串

    while(*s)

    {

     putchar(*s)

             s++

     }

  }

注意:

1.形参  设计为 const char * 

                  目的,防止函数中的误操作

   实参   可以数组名  ; 可以指针变量 ; 可以直接是一个字符串常量 

2.好处  

(1) 提前发现问题,将运行时问题,提前到编译时

(2) const char * 可以接收 char *  ;  const char *;

注意:能写成 const 都写成const

const char *s

const 只读

const int a;此时a是一个只读的变量

const char * s

char  const *s

char * const s

int a=10;

int *p=&a;

const  int  *p=&a   const限定是基类型

                             表示不能通过*p的方式, 修改基类型数据

 int  const  *p=&a   const限定是基类型

                             表示不能通过*p的方式, 修改基类型数据

int * const p=&a   const 限定是 指针变量p

                             表示将p限定为只读

                              表示p不能被修改

const int * const p=&a;    基类型和指针变量都不可以修改

                                            p=&b;    *p=b 都不能修改

原则:

就近原则  ------const  离谁近就 限定谁

应用:

          1.如果 不想通过*p方式改变基类型对应的数据

              const int *p=&a;  int const *p=&a

          2.如果指针变量p  定义好后  不想再指向别的变量

               int  * const p=&a;

指针 + 字符串

字符串----在c语言中是按照字符数组的形式存储

          -----字符串常量 --存储在字符串常量区

处理字符串:

插入s[ ]="hello";  表示在栈上开辟一块空间 用字符串常量中的“hello”

const char * p =“hello”  表示p指向了字符创常量区中的“hello”

                                       因为 是指向了字符串常量区

                                       只能做读取操作  不能修改

char * strncpy(char * dest, const   char  *src, size_t  n)

{      1.始终拷贝了n下

       2.拷贝 ‘ \0 ’ && n

       3.考虑n  n有没有结束

          完成剩余的次数的拷贝

          拷贝过去的数据 ‘\0’

}

总结:

1.指针操作一维字符型数组

2.知识点

               (a)指针变量的类型 是怎么确定的

                 (b)一维字符型数组  与字符串的 关系

                   (c)处理字符串数据的方式——char s [ ]="hello"

                                                                ——const char * p="hello"

                        (d) const ------关键字的使用方法

                                       ------形参

                         (e)

3.实现字符串相关函数

gets 

puts  -----string  ---- stdio

strlen

strcpy/strncpy

strcat/strncat

strcmp/strncmp

拷贝的是两个整型数组

void * memcpy(void * dest,const  void * src ,size_t n)

{     一个 字节一个字节拷贝    }

void *   -----NULL  空指针

            -----空类型的指针---万能指针

            -----可以接收任何类型的指针

注意:

1.如果  用空类型的指针进行 间接运算   必须强转成  有明确类型的指针

指针操作二维数组

int  a [2] [3];

二维数组:

1.c语言中并不存在  真正的二维数组

2.二维数组的本质  是一维数组的一维数组

3.二维数组 也符合数组的特点------ 连续性  有序性  单一性

从二维数组的本质出发

int  [3]  a [2];

问题:

1.确定需要定义什么类型的指针?

&a[0]

       -----a[0]---int [3]

       ------&a[0]---int [3] *

       -------c语言中不支持 int[3] *

     ----------正确写法 int (*) [3]

int  (*p) [3] =a;   p指向了二维数组a

                           基类型 int * [3]

*p  <=> a[0]       相当于是内部这个一维数组的数组名

          (*p)[0]

             *(*p+0)<=>**p

  *(*( p+1)+1)<=>a[ 1 ] [ 1 ]

   *(*(p+i)+j)<=>a[ i ] [ j ]

注意:

二维数组的操作

从二维数组的本质进行的  二维数组的本质  一维数组的一维数组

直接访问操作  也是一维 一维的展开

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值