//
// 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---指针和字符串的更多相关文章

  1. 深入理解C指针之五:指针和字符串

    原文:深入理解C指针之五:指针和字符串 基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常 ...

  2. [C语言]进阶|指针与字符串

    ------------------------------------------------------------------------------------ 回顾:[C语言]指针与字符串 ...

  3. C语言:通过指针对字符串进行拼接

    // //  main.c //  Pointer_stringcat // //  Created by ma c on 15/8/2. //  Copyright (c) 2015年 bjsxt. ...

  4. C语言用一级指针处理字符串的反思

    1.一级指针处理字符串的常见方式 如果使用单个指针,不方便对字符串本身进行操作,只适合遍历. 使用两个指针, 两个指针和字符串大致有两个常见处理方式: (1)两个指针从字符串首部开始向后移动,同时处理 ...

  5. C++复习5.指针数组字符串

    C/C++ 指针.数组和字符串 本次学习指针.数组.字符串.引用的内存映像. 1.指针 指针的本质:可以执行的程序是由指令.数据和地址组成的.当CPU访问内存单元的时候,不论是读取还是写入,首先要把内 ...

  6. 程序设计入门-C语言基础知识-翁恺-第七周:指针与字符串-详细笔记(七)

    目录 第七周:指针与字符串 7.1 指针初步 7.2 字符类型 7.3 字符串 7.3 课后练习 第七周:指针与字符串 7.1 指针初步 sizeof 是一个运算符,给出某个类型或变量在内存中所占据的 ...

  7. 【C语言】-指针和字符串

    本文目录 字符串回顾 一.用指针遍历字符串的所有字符 二.用指针直接指向字符串 三.指针处理字符串的注意 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速 ...

  8. DELPHI数组,指针,字符串转换的例子

    关于数组,指针,字符串转换的例子 var   aa:   array [0..5] of Char;   bb:Pointer;   cc:string;   dd:PChar; procedure ...

  9. 31深入理解C指针之---指针和字符串

    一.字符串与指针 1.定义:使用字符指针表示字符串 2.特征: 1).可以直接使用字符串字面量初始化字符指针 2).声明后,赋值就只能使用字符串操作函数strcpy函数赋值 3).可以使用类似于数组的 ...

  10. C语言指针和字符串

    #include <stdio.h> int main() { /********************************************* * 内存: * 1.常量区 * ...

随机推荐

  1. 树莓派-基于raspivid实现拍视频

    经过上一篇<<树莓派-安装摄像头模块>>之后 想要用摄像头模块拍一段视频的话,可以从命令行运行 raspivid 工具.下面这句命令会按照默认配置(长度5秒,分辨率1920x1 ...

  2. 在C#程序中,创建、写入、读取XML文件的方法

    一.在C#程序中,创建.写入.读取XML文件的方法 1.创建和读取XML文件的方法,Values为需要写入的值 private void WriteXML(string Values) { //保存的 ...

  3. 酷派 5267 刷入第三方 recovery教程 刷机 ROOT

    准备工作: 一台电脑: 酷派5267手机: 一张内存卡: 下载好刷机资料:  http://pan.baidu.com/s/1i4LoVh7 备用下载: http://pan.baidu.com/s/ ...

  4. 关于VM虚拟机在使用网络时与锐捷网络冲突的解决问题

    在使用NAT网络模式的时候,锐捷会因为冲突强制关闭NAT服务,导致虚拟机无法上网,解决的办法是让NAT服务一直保持启动,写一个bat脚本来一直检测服务是否在运行,并且进行启动操作. 当不需要用虚拟机的 ...

  5. System.Web.Caching.Cache类 Asp.Net缓存 各种缓存依赖

    Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例. 一.属性 属性 说明 Count 获取存储在缓存中的 ...

  6. Table边框使用总结 ,只显示你要显示的边框

    表格的常用属性 基本属性有:width(宽度).height(高度).border(边框值).cellspacing(表格的内宽,即表格与tr之间的间隔). cellpadding(表格内元素的间隔, ...

  7. NET MVC FileResult 导出/下载 文件/Excel

    参考http://www.cnblogs.com/ldp615/archive/2010/09/17/asp-net-mvc-file-result.html 1.引入NPOI 2.代码 using ...

  8. python核心编程中的对象值比较VS对象身份比较(转载)

    转载地址: https://blog.csdn.net/Mluka/article/details/51076786 在python核心编程第四章中,P69在优化下面这段代码时提出了:对象值比较VS对 ...

  9. loadrunner安装方法

    1.loadrunner安装网盘地址:  http://pan.baidu.com/s/1hrP6mDQ 一般会提示:“vc2005_sp1_with_atl_fix_redist 2.确认时提示缺少 ...

  10. 2018 noip 考前临死挣扎

    基础算法 倍增 贪心 分块 二分 三分 数据结构 线段树 对顶堆 数学 质数 约数 同余 组合 矩阵乘法 图论 二分图判定以及最大匹配 字符串 Tire树 KMP 最小表示法 Hash Manache ...