赞
踩
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 ]
注意:
二维数组的操作
从二维数组的本质进行的 二维数组的本质 一维数组的一维数组
直接访问操作 也是一维 一维的展开
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。