厦门网站建设价格xm37,搜房网站建设分析,中小企业网络营销论文,培训体系搭建C 指针1 关于内存那点事2 指针的概念3 指针变量的定义方法4 指针的分类5 指针和变量的关系6 指针和数组元素之间的关系7 指针数组8 指针的指针9 字符串和指针9.1 字符串的定义9.2 字符串的可修改性#xff1a;9.3 初始化赋值9.4 使用时赋值9.5 字符串和指针总结10 数组指针11 …
C 指针1 关于内存那点事2 指针的概念3 指针变量的定义方法4 指针的分类5 指针和变量的关系6 指针和数组元素之间的关系7 指针数组8 指针的指针9 字符串和指针9.1 字符串的定义9.2 字符串的可修改性9.3 初始化赋值9.4 使用时赋值9.5 字符串和指针总结10 数组指针11 指针和函数的关系12 经常容易混淆的指针概念13 特殊指针1 关于内存那点事
2 指针的概念
3 指针变量的定义方法
4 指针的分类
5 指针和变量的关系
6 指针和数组元素之间的关系
7 指针数组
8 指针的指针
9 字符串和指针
9.1 字符串的定义
字符串就是以 \0 结尾的若干的字符的集合。 字符串的地址是第一个字符的地址。如字符串 I Love You ! 的地址即字符串中字符 I 的地址。
字符串存放在 数组 中即在内存栈、静态全局区中开辟了一段空间存放字符串。
定义了一个字符数组str用来存放多个字符并用I love C!给 str 数组初始化
字符串 I love C! 存放在 str 中。
char str[100] I love C!;注 普通全局数组内存分配在静态全局区。 普通局部数组内存分配在栈区。 静态数组静态全局数组、静态局部数组内存分配在静态全局区。 字符串存放在 文字常量区在文字常量区开辟了一段空间存放字符串将字符串首地址赋值给指针变量。
定义了一个字符指针变量 str只能存放字符地址编号。
char *str I love C !;I love C ! 这个字符串中的字符不是存放在 str 指针变量中。
str 只是存放了字符 I 的地址编号I love C ! 存放在文字常量区。字符串存放在 堆区使用 malloc 等函数在堆区申请空间将字符串拷贝到堆区。
动态申请了 10 个字节的存储空间首地址给 str 赋值。
char* str (char*) malloc(10);将字符串I LOVE YOU !拷贝到 str 指向的内存里。
strcpy(str, I LOVE YOU !);9.2 字符串的可修改性
字符串内容是否可以修改取决于字符串存放在哪里。
存放在数组中的字符串的内容可修改
char str[100] I love C !;
str[0] x; //正确可以修改的。
注数组没有用 const 修饰。文字常量区里的内容是不可修改的 char *str I love C !;
printf(str %s\n, str);//I love C !
printf(str %s\n, str2);//love C !错误I 存放在文字常量区不可修改。
*str x; //这么二次赋值 是错误的哦错误编译无错但是赋值结果会导致数据错乱因为没有正确的结束符赋值字符串地址是可以的哦
char a a;
str a;注 1、str 指向文字常量区的时候它指向的内存的内容不可被修改。 2、str 是指针变量可以指向别的地方即可以给str 重新赋值让它指向别的地方。 堆区的内容是可以修改的
char *str (char*)malloc(10);
strcpy(str, I love C);
*str y; //正确可以因为堆区内容是可修改的注 1、str 指向堆区的时候str 指向的内存内容是可以被修改的。 2、str 是指针变量也可以指向别的地方。即可以给str 重新赋值让它指向别的地方 注意 str 指针指向的内存能不能被修改要看 str 指向哪里。 str 指向文字常量区的时候内存里的内容不可修改 str 指向数组非const 修饰、堆区的时候它指向内存的内容是可以修改 #define _CRT_SECURE_NO_WARNINGS
#include stdio.h
#include string.h
#include malloc.hint main(int argc, char* argv[])
{char* str (char*)malloc(sizeof(char)*32);if(str){strcpy(str, I love C);strcpy_s(str, 32, I love C);}printf(--str %s--\n, str); //--str I love C--if (str) {*str y; //正确可以因为堆区内容是可修改的}printf(--str %s--\n, str); //--str y love C--return 0;
}9.3 初始化赋值
1.字符数组初始化
char buf_aver[20] hello world;2.指针指向文字常量区初始化
char *buf_point hello world;3、指针指向堆区堆区存放字符串。 不能初始化只能先给指针赋值让指针指向堆区再使用strcpy、scanf 等方法把字符串拷贝到堆区。
char *buf_heap;
buf_heap (char *)malloc(15);
strcpy(buf_heap, hello world);
scanf(%s, buf_heap);9.4 使用时赋值
字符数组使用scanf 或者strcpy
char buf[20] hello world;
buf hello kitty; 错误,因为字符数组的名字是个常量,不能用等号给常量赋值。
strcpy(buf, hello kitty); 正确数组中的内容是可以修改的
scanf(%s, buf); 正确数组中的内容是可以修改的指针指向文字常量区
char *buf_point “hello world”;
1) buf_point hello kitty; 正确,buf_point 指向另一个字符串
2) strcpy(buf_point, hello kitty); 错误这种情况buf_point 指向的是文字常量区内容只读。当指针指向文字常量区的时候不能通过指针修改文字常量区的内容。
指针指向堆区堆区存放字符串
char *buf_heap;
buf_heap (char *)malloc(15);
strcpy(buf_heap, hello world);
scanf(%s, buf_heap);9.5 字符串和指针总结 1、指针可以指向 文字常量区。 1指针指向的文字常量区的内容不可以修改 2指针的指向可以改变即可以给指针变量重新赋值指针变量指向别的地方。 2、指针可以指向 堆区。 1指针指向的堆区的内容可以修改。 2指针的指向可以改变即可以给指针变量重新赋值指针变量指向别的地方。 3、指针也可以指向 数组非const 修饰 char buf[20] hello world; char *str buf; 这种情况下 1可以修改buf 数组的内容。 2可以通过str 修改str 指向的内存的内容即数组buf 的内容。 3不能给buf 赋值 buf “hello kitty”; 错误的。 4可以给str 赋值及str 指向别处。str “hello kitty”; 10 数组指针
11 指针和函数的关系
12 经常容易混淆的指针概念
13 特殊指针