概述
一、指针
1、指针是一个变量,用来存放一块内存空间的地址。
2、指针的大小是固定的4/8个字节(32位平台/64位平台)。
3、 C/C++会把常量字符串存储到单独的一个内存区域,当几个指针。 指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。
4、 数组指针:一个能够指向数组的指针。数组指针中存放的应该是数组的地址。
int (*p)[10];
//解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个指针,指向一个 数组,叫数组指针。
//这里要注意:[]的优先级要高于*号的,所以必须加上()来保证p先和*结合。
5、指针数组:一个存储指针的数组
int *arr[10]; //数组的每个元素是int*
6、函数指针:指向一个函数的指针
void (*fun)();
//fun先和*结合,说明fun是指针,指针指向的是一个函数,指向的函数无参数,返回值 类型为void。
int (*parr1[10])();//函数指针数组
7、回调函数:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
8、数组名的意义
- sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
- 除此之外所有的数组名都表示首元素的地址。
二、数据类型的存储
1、原码、反码、补码
计算机中的有符号数有三种表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位三种表示方法各不相同。
原码
直接将二进制按照正负数的形式翻译成二进制就可以。
反码
将原码的符号位不变,其他位依次按位取反就可以得到了。
补码
反码+1就得到补码。
2、在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理; 同 时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需 要额外的硬件电路。
3、大小端
大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。
小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
//判断大小端
#include<stdio.h>
int check_sys(){
int i = 1;
return (*(char*)& i);
}
//int check_sys(){
// union{
//
int i;
//
char c;
// }un;
// un.i = 1;
// return un.c;
//}
int main(){
int ret = check_sys();
if(ret==1){
printf("小端n");
}
else{
printf("大端n");
}
return 0;
}
三、字符函数
1、strlen size_t strlen ( const char * str )
求字符串长度
字符串以’ ’ 作为结束标志,strlen函数返回的是在字符串中 ‘ ’ 前面出现的字符个数(不包含 ‘ ’ )。
参数指向的字符串必须要以 ‘ ’ 结束。
注意函数的返回值为size_t,是无符号的
//模拟实现
int _strlen(const char* str){
int count=0;
while(*str){
count++;
str++;
}
return count;
}
//不创建临时变量
int _strlen(const char* str){
if(*str=='