指针与字符串(篇七)

  1. 指针
    (1)什么是指针
    指针是一个特殊的变量,它里面存储的数值被解释成内存里的一个地址!
    a. 指针的类型
    b. 指针所指向的类型
    c. 指针的值或者叫指针所指向的内存区
    d. 指针本身所占据的内存区

(2)定义及初始化
指针类型是一种特殊类型

类型说明符 空格(星号) 指针变量名称;
类型说明符 (星号) 空格 指针变量名称;
类型说明符 空格 (星号) 空格 指针变量名称;

*:取值运算符,间接运算符
&:取地址符号

*& = 1; // * 与 & 可以理解为一对倒数

例如:
int *pa;
char *pc;
double *pd;

初始化:
int num = 88;
int *pa = # //定义的同时初始化
int *pb; //定义一个整型指针变量
pb = # //初始化指针变量

int *pc = NULL; //NULL 为空地址,即指针的零值
pc = pa; //可以将指针变量赋给相同类型的指针

初始化的必要性:防止野指针的出现
野指针:
未初始化,或者其指向的内存被释放,而指针没有被置空

危害:
造成系统资源浪费,容易造成未知的致命错误!!

野指针的值不确定,不可访问其值,在实际应用中,应避免野指针的使用!!!

(3)地址的访问
*:间接访问运算符
&:取地址运算符

	int a = 10;
	int *pa = &a;
	
	*pa = 10;
	a = 10;
	
	int *pa = NULL;
	printf("*pa = %d
", *pa); 	//Error,空指针不可访问其值

	int *pa, pb, pc;  //有几个指针???
	pa 为整型指针变量
	pb,pc为整型变量

(4)指针的大小

sizeof(char *)   = 8
sizeof(short *)  = 8
sizeof(int *)    = 8
sizeof(long *)   = 8
sizeof(float *)  = 8
sizeof(double *) = 8

指针的大小与数据类型无关!
64位机:8 Byte
32位机:4 Byte

(5)指针与数组
int arr[7] = {1,2,3,4,5,6,7};

	arr:
	&arr[0]:
	&arr:
	
	int *pa = arr;
	int *pb = &arr[0];
	int *pc = &arr[3];
	
	数组元素的访问:
	通过下标形式:
		arr[i];
		pa[i];
	通过偏移量的形式:
		*(arr + i);
		*(pa + i);

(6)指针的运算
减法运算:
两指针相减,表示两个地址之间的距离;

	int a = 2;
	int b = 5;
	
	int *pa = &a;
	int *pb = &b;
	
	pa - pb; //表示 pa 与 pb 之间的距离
	
自增运算:
	++:
		pa++: 表示 pa 向高地址方向移动
	--:
		pa--: 表示 pa 向低地址方向移动

加减一个整数:
	pa + n:表示将指针向高地址方向移动
		移动字节数:
			n * sizeof(指针所指向的类型)
			
		例如;
			int *pa;
			pa + 4;
			
			偏移: 4 × sizeof(int) = 16 Byte;	
	pa - n
关系运算:
	pa == pb: pa , pb 指向同一块内存
	pa < pb:
	pa > pb:	
	pa == NULL:	pa 是一个空指针
	pa != NULL: pa 不是一个空指针

(7)指针的几个概念
类型说明符 *指针变量名;
指针的类型:
把指针声明语句里的指针名去掉,剩余的部分即为指针的类型
即指针的类型为:
类型说明符 *

指针所指向的类型:
	去掉指针变量名及其前面的一个 *,剩余的部分即为指针指向的类型
	即:
		类型说明符
	
指针的值:
	是指指针本身存储的值,这个值被编译器当作地址
	
	指针所指向的内存区就是从指针值所代表的内存地址开始,长度为
	sizeof(指针所指向的类型) 的一片内存区;
	
指针本身所占据的内存区:
	sizeof(指针的类型);
	32 OS: 4 Byte
	64 OS: 8 Byte
  1. 字符串
    (1)定义
    由双引号扩起来的字符序列集合,我们称之为字符串
    字符串常量:
    “a”
    “abfnd”
    “123sfs”
    “fsg23ter:njbv”

    ‘a’ 与 “a” 之间的区别:
    ‘a’ 一个字节
    “a” 两个字节

    字符串:以 ‘’ 作为结束标志,在字符串中,通常不显示出来,但其是存在的

    C 中无字符串对应的数据类型
    通常使用字符数组来存储字符串:
    char arr[32] = {‘1’, ‘2’, ‘a’};
    char buf[32] = {“hello, World!”};
    char str[16] = “hello”;

    char af[5] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’};
    char bf[5] = “abcde”; //Error

(2)字符串的输入和输出 — 占位符:%s
a. printf()/scanf()
printf() 需加换行符号

b. puts()/gets()
	puts 函数自动换行
	gets()  //有 bug 不建议使用!!!!

(3)字符串与指针
同数组与指针类似

(4)常用字符串处理函数
a. 字符串长度:strlen():
不包含字符串结束标志: ‘’

b. 字符串拷贝:strcpy()
	strcpy(destArray, srcArray)
	将 srcArray 拷贝到 destArray 中
	拷贝时, destArray 要有足够大的空间,否则会出现拷贝错误
	
c. 字符串比较:strcmp()
d. 字符串拼接:strcat()
千里之行,始于足下!
原文地址:https://www.cnblogs.com/MINAIot/p/13041014.html