- 指针
(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)定义
由双引号扩起来的字符序列集合,我们称之为字符串
字符串常量:
“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()