c19---指针和字符串
//
// main.c
// 指针和字符串
//
// Created by xiaomage on 15/6/14.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #include <stdio.h> int main(int argc, const char * argv[]) {
// 保存字符串
char str[] = "lnj";//字符串 这个字符数组名 也是char*类型,
printf("str = %s\n", str);
str[] = 'm';
printf("str = %s\n", str); // 因为数组名就是数组的地址, 数组名保存的就是数组的第0个元素的地址,所以我们可以使用指针来保存字符串 // 通过指针保存一个字符串, 其实就是保存的字符串第0个元素的地址
char *str2 = "lmj";
printf("str2 = %s\n", str2);
str2[] = 'm'; //字符串中的某一个字符 不能修改
printf("str2 = %s\n", str2); /* 通过数组保存字符串和通过指针保存字符串的区别:
1.如果通过数组来保存字符串, 那么字符串是一个变量 str 可以修改
如果通过指针来保存字符串, 那么字符串是一个常量 str2 不能修该,
2.数组保存的字符串存储在内存的栈中, 而通过指针保存的字符串存储在常量区
存储在栈中的变量有一个特点, 当作用域结束系统会 自动释放该变量
存储在常量区中的值有一个特点, 不会被释放, 而且 多个相同的值对应的地址相同*/ char str3[] = "lnj";
printf("str = %p\n", str);
printf("str3 = %p\n", str3);//地址不一样 char *str4 = "lmj";
printf("str2 = %p\n", str2);
printf("str4 = %p\n", str4);//地址一样 // 利用指针保存字符串的应用场景
for (int i = ; i < ; i++) {
// 意味着会开辟100块存储空间来保存xmg这个字符串,并且会释放100次,性能问题,
char str5[] = "xmg";
char *str6 = "xmg";
printf("str5 = %s\n", str6);
} /*
保存字符串的两种方式:
char str[] = "lnj";
存储的位置: 栈
特点: 相同的字符串会重复的分配存储空间
字符串中的字符可以修改 char *str = "lnj"
存储的位置: 常量区
特点: 相同的字符串不会重复的分配存储空间
字符串不可以修改
*/ return ;
}
//
// main.c
// 指针和字符串注意点
// #include <stdio.h> int main(int argc, const char * argv[]) { // 指针没有被初始化不能随便使用, 野指针
int *p;
printf("*p = %i\n", *p); //报错 char str[];
scanf("%s", str);//可以存进去
printf("str = %s\n", str); // 1.指针没有初始化, 野指针,没有指向任何地址,没法存,
char *str;
scanf("%s", str); //报错
printf("str = %s\n", str); // 注意: 用指针来保存字符串不可以被修改
// 指针没有初始化不能随便使用
return ;
}
//
// main.c
// 指针数组,字符串数组
// #include <stdio.h> int main(int argc, const char * argv[]) { char str1[] = "lnj";
char str2[] = "lmj";
char str3[] = "jjj";
char str4[] = "lk"; char strs[][] =
{ //字符串数组是二维数组
"lnj",
"lmj",
"jjj",
"lk"
}; char *str1 = "lnj"; //char [] === char * === " ... "
char *str2 = "lmj";
char *str3 = "jjj";
char *str4 = "lk"; // 定义数组的格式: 元素类型 数组名称[元素的个数]
int a = ;
int b = ;
int nums[] = { , }; char* names[] = //每一个元素是char*也就是char[],也可以是字符串,
{
"lnj",
"lmj",
"jjj",
"lk"
}; for (int i = ; i < ; i++) {
printf("names[%i] = %s\n", i , names[i]);
} return ;
}
//
// main.c
// 指针类型的特点
//
// 数组名即是xx[]也是xx*类型,字符串名即是char[]类型也是char*类型
// xx[]和xx*是数组类型的两种形式,
// #include <stdio.h>
void change();
void change2();
void change3(int values[]);
void change4(int *p);
char *demo();
char *demo2(); int main(int argc, const char * argv[]) {
/*
只要是数据类型就具备3个特点
1.可以用来定义变量
2.可以用来作为形参的类型
3.作为返回值
*/ int num = ;
change(num);
printf("num = %i\n", num); char *name = "lnj";//指针指向字符串是一个常量,字符串的字符不能更改,
change2(name); int nums[] = {, , }; // int[] === int*, nums是int[]类型也是int*类型,
change3(nums); // 数组名就是数组的地址,998
change4(nums); // 数组名就是数组第0个元素的地址,998
printf("nums[0] = %i\n", nums[]); char *name = demo();//name指向常量区"lnj"所在的区域
printf("name = %s\n", name); char *name2 = demo2();
printf("name2 = %s\n", name2); return ;
} char *demo2() //name和"lnj"都在函数所在的栈区域,"lnj"占4个字节,函数执行结束后销毁,
{
char name[]= "lnj";
return name;
} char *demo() //demo函数会在栈中开辟存储区域,name在函数所在的区域内,"lnj"不在函数所在的内存区域而是在常量区,
{
char *name = "lnj";//字符串名即是char*类型也是char[]类型,
return name;
} void change4(int *p)
// int *p = nums; == int *p = &nums; == int *p = &nums[0]
// int *p; p = nums; p == nums;
{
p[] = ;
}
// 不专业
void change3(int values[])
{
values[] = ;
} void change2(char *p)
{
*p = "lmj";//不能更改
} void change(int value)
{
value = ;
}
//
// main.c
// 指针练习
//
// Created by xiaomage on 15/6/14.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #include <stdio.h>
#include <string.h>
int myStrlen(char *str);
int myStrlen2(char *str);
int myStrlen3(char *str); int main(int argc, const char * argv[]) {
// 要求自己实现strlen函数
char *name = "lnj";
size_t size = strlen(name);
int size =myStrlen3(name);
printf("size = %i\n", size);
return ;
} int myStrlen3(char *str) //str[i],*str++,数组名和指针名的使用是一样的,xx[]和xx*是数组类型的两种形式,
{
int count = ;
// \0 ascii 0 // 0代表假 1真
while (*str++) count++; return count;
} int myStrlen2(char *str)
{
int count = ;
// *str == str[0]
while (*str++ != '\0') {
count++; // 1
// str = str + 1; // str == str[1]
// str++; // ++可以在变量名前, 也可以在变量名后
}
return count;
} int myStrlen(char *str)
{
int count = ;
while (str[count] != '\0') {
count++;
}
return count;
}
c19---指针和字符串的更多相关文章
- 深入理解C指针之五:指针和字符串
原文:深入理解C指针之五:指针和字符串 基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常 ...
- [C语言]进阶|指针与字符串
------------------------------------------------------------------------------------ 回顾:[C语言]指针与字符串 ...
- C语言:通过指针对字符串进行拼接
// // main.c // Pointer_stringcat // // Created by ma c on 15/8/2. // Copyright (c) 2015年 bjsxt. ...
- C语言用一级指针处理字符串的反思
1.一级指针处理字符串的常见方式 如果使用单个指针,不方便对字符串本身进行操作,只适合遍历. 使用两个指针, 两个指针和字符串大致有两个常见处理方式: (1)两个指针从字符串首部开始向后移动,同时处理 ...
- C++复习5.指针数组字符串
C/C++ 指针.数组和字符串 本次学习指针.数组.字符串.引用的内存映像. 1.指针 指针的本质:可以执行的程序是由指令.数据和地址组成的.当CPU访问内存单元的时候,不论是读取还是写入,首先要把内 ...
- 程序设计入门-C语言基础知识-翁恺-第七周:指针与字符串-详细笔记(七)
目录 第七周:指针与字符串 7.1 指针初步 7.2 字符类型 7.3 字符串 7.3 课后练习 第七周:指针与字符串 7.1 指针初步 sizeof 是一个运算符,给出某个类型或变量在内存中所占据的 ...
- 【C语言】-指针和字符串
本文目录 字符串回顾 一.用指针遍历字符串的所有字符 二.用指针直接指向字符串 三.指针处理字符串的注意 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速 ...
- DELPHI数组,指针,字符串转换的例子
关于数组,指针,字符串转换的例子 var aa: array [0..5] of Char; bb:Pointer; cc:string; dd:PChar; procedure ...
- 31深入理解C指针之---指针和字符串
一.字符串与指针 1.定义:使用字符指针表示字符串 2.特征: 1).可以直接使用字符串字面量初始化字符指针 2).声明后,赋值就只能使用字符串操作函数strcpy函数赋值 3).可以使用类似于数组的 ...
- C语言指针和字符串
#include <stdio.h> int main() { /********************************************* * 内存: * 1.常量区 * ...
随机推荐
- 树莓派-基于raspivid实现拍视频
经过上一篇<<树莓派-安装摄像头模块>>之后 想要用摄像头模块拍一段视频的话,可以从命令行运行 raspivid 工具.下面这句命令会按照默认配置(长度5秒,分辨率1920x1 ...
- 在C#程序中,创建、写入、读取XML文件的方法
一.在C#程序中,创建.写入.读取XML文件的方法 1.创建和读取XML文件的方法,Values为需要写入的值 private void WriteXML(string Values) { //保存的 ...
- 酷派 5267 刷入第三方 recovery教程 刷机 ROOT
准备工作: 一台电脑: 酷派5267手机: 一张内存卡: 下载好刷机资料: http://pan.baidu.com/s/1i4LoVh7 备用下载: http://pan.baidu.com/s/ ...
- 关于VM虚拟机在使用网络时与锐捷网络冲突的解决问题
在使用NAT网络模式的时候,锐捷会因为冲突强制关闭NAT服务,导致虚拟机无法上网,解决的办法是让NAT服务一直保持启动,写一个bat脚本来一直检测服务是否在运行,并且进行启动操作. 当不需要用虚拟机的 ...
- System.Web.Caching.Cache类 Asp.Net缓存 各种缓存依赖
Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例. 一.属性 属性 说明 Count 获取存储在缓存中的 ...
- Table边框使用总结 ,只显示你要显示的边框
表格的常用属性 基本属性有:width(宽度).height(高度).border(边框值).cellspacing(表格的内宽,即表格与tr之间的间隔). cellpadding(表格内元素的间隔, ...
- NET MVC FileResult 导出/下载 文件/Excel
参考http://www.cnblogs.com/ldp615/archive/2010/09/17/asp-net-mvc-file-result.html 1.引入NPOI 2.代码 using ...
- python核心编程中的对象值比较VS对象身份比较(转载)
转载地址: https://blog.csdn.net/Mluka/article/details/51076786 在python核心编程第四章中,P69在优化下面这段代码时提出了:对象值比较VS对 ...
- loadrunner安装方法
1.loadrunner安装网盘地址: http://pan.baidu.com/s/1hrP6mDQ 一般会提示:“vc2005_sp1_with_atl_fix_redist 2.确认时提示缺少 ...
- 2018 noip 考前临死挣扎
基础算法 倍增 贪心 分块 二分 三分 数据结构 线段树 对顶堆 数学 质数 约数 同余 组合 矩阵乘法 图论 二分图判定以及最大匹配 字符串 Tire树 KMP 最小表示法 Hash Manache ...