您的位置:首页 > 编程语言 > C语言/C++

黑马程序员——C语言基础---指针3

2015-09-29 16:57 281 查看
                                                                            ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------

八、字符串指针介绍及使用 

1、字符串指针 
在C语言中,可以用两种方法访问一个字符串  
1)字符数组 
char string[]=”I love China!”;
printf("%s\n",string);
说明:和前面介绍的数组属性一样,string是数组名,它代表字符数组的首地址。  
2)字符串指针指向字符串 
char *变量名="字符串内容";
字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的。只能按对指针变量的赋值不同来区别。对指向字符变量的指针变量应赋予该字符变量的地址。如: 
char c,*p=&c; 表示p是一个指向字符变量c的指针变量。 
而: 
char *s="C Language"; 则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。  
字符串指针定义和初始化  
定义的同时进行初始化 
char *ps="C Language";  
注意: 
1、使用字符数组来保存的字符串是保存栈里的,保存栈里面东西是可读可写,所有我 们可以改变里面的字符当把一个字符串常量赋值一个字符数组的时候,那么它会把字符串常量 中的没有字符都放到字符数组里面 
2、使用字符指针来保存字符串,它保存的是字符串常量地址,常量区是只读的,所以我们不可以修改字符串中的字符   
2、字符串指针使用注意  
1)可以查看字符串的每一个字符  
2)不可以修改字符串内容 
3)妙用字符串指针 
将指针变量指向一个格式字符串,用在printf函数中,用于输出二维数组的各种地址表示的值。但在printf语句中用指针变量PF代替了格式串。 这也是程序中常用的方法  
4)不能够直接接收键盘输入

<span style="font-size:14px;">#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
//"zfbanzhang zaiyiqi" 这个字符串存储在常量去
//str 只保存了字符串常量的首地址
char *str = "zfbanzhang zaiyiqi";
//指针变量都是占用8个字节
printf("sizeof(str) = %ld\n",sizeof(str));
printf("str len = %ld\n",strlen(str));
//str是指针变量
//str重新指向另外一个字符串常量 "I LOVE YOU"
//保存的是 "I LOVE YOU" 字符串常量的首地址
str = "I LOVE YOU";
printf("%s\n",str);
char ch[]="abc";  //存在栈区
ch[2]='Z';
printf("%s\n",ch);
//读取字符串常量的某个字符
printf("%c\n",*(str+2));  //L
for (int i=0; i<strlen(str); i++) {
printf("%c\t",*(str+i));
}
//*(str+2)='X';  错误的,因为字符串常量是在常量区存储
//在常量区保存的数据都是只读的
//str2 没有赋初值,野指针
char *str2=NULL;
//这句话的作用给先申请了100个字节的内存 str2
str2 = malloc(100);
printf("=======%s\n",str2);
//另外一种解决方案
char ch3[100];
char *str3=ch3;
scanf("%s",str3);
printf("----->%s\n",str3);
return 0;
}</span>

九、内存管理和内存分区 
1、内存管理的基本概念 
内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。  
1、内存分配方式 内存分配方式有三种:  
(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。  
(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结 束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。  
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内 存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多 
2、内存分区 
栈 (stack):栈又称堆栈, 是用户存放程序临时创建的局部变量。  
堆(heap):堆是用于存放进程运行中被动态分配的内存段。
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量和静态变量。
数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量和静态变量的一块内存区域。数据段属于静态内存分配,可以分为只读数据段和读写数据段。
代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。 
内存分为5大区域
栈区 -- 存放局部变量,临时变量 
堆区 -- 程序运行过程中,动态分配的内存 
BSS区(全局区,静态区) -- 未初始化的全局变量和静态变量 
数据段(常量区) -- 已经初始化的全局变量和静态变量 
代码段 -- 源码代码程序编译产生的二进制数据
十、常见的内存分配函数 
1、为什么要进行动态内存分配? 
以数组为例,一个数组的元素是存储于内存中连续的位置的,当数组被声明时其所需要的内存在 编译的时候也已经被分配。但是有些情况下使用这种静态分配方式是不方便的,例如使用数组在 存储班级中所有学生的成绩,但是不同班级的学生的数量是不同,在这种情况下,你应该给该数 组分配多大的内存??一般是按照可以容纳可能出现的最多元素来做 
优点: 简单 
缺点:声明中引入了限制,如果程序需要使用的元素超过声明的长度,怎么办??  
1)解决上一个缺点的方法就是把数组声明的更大一些,但是同时新的缺点又出现了,如果程序实际需要的元素数量比较少时,这样绝大部分的内存空间都被浪费了。 
2)如果超过数组容纳的范围时,程序必须有合理的响应,不应该由于一个异常而失败,但也 不应该printf看上去正确实际错误的结果。  
2、常见动态分配内存分配函数 

C语言中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言 指针