一、一维数组
1、未被"初始化列表"指定的数组剩余元素,系统自动把整型初始化为0,字符型初始化为'\0',指针初始化为NULL
二、数组名含义
1、数组名表示整个数组,如下:
(1)在定义数组的同一个寒暑假中,求sizeof(arr)
(2)&arr+1,则加整个数组大小
2、其它情况一维数组的数组名都表示数组首元素的地址
三、指针
1、int *p; //整型指针变量 指针 == 地址
int *p = &a; // 保存整型地址的值 p和a建立关系
* //说明在其后的变量为指针型;*在定义时使用,在使用时不写;当使用时*不写,如:p = &b;
2、p &p *p 指针型变量
a &a 普通变量
3、int a = 100;
int b = 200;
int *p = &a; //定义p为指针型变量,p与a建立联系
*p = 100; //解引用 a = 100;
p = &b; //p与b建立联系
*p = 1000; //解引用,b = 1000;
int **pp = &p; //定义*pp为指针型变量,*pp与p建立联系
*pp = &a; //解一次引用,让*pp保存a的地址
**pp = 2000; //a = 2000;
*pp = &b; //保存b的地址
**pp = 3000; //b = 3000;
4、野指针/悬挂指针:用户没有访问权限;编译器没有办法预防野指针
5、int *tmp = p1; //true
int *tmp;
*tmp = *p1; //erro 不允许解引用,崩溃
规律:子函数的改变要想影响到父函数:(1)传指针;(2)解引用(1与2是必要不充分条件)
6、 p = NULL; //NULL是无效指针
四、字符数组
1、初始化
局部变量若没有初始化,值为随机值
若没初始化,可能出现诡异的值:烫烫烫(CCCC) 屯屯屯(CDCD)
2、表示方法
char brr[10] = {'a','b','c','d'};
char crr[10] = {"abcd"};
char drr[10] = "abcd"; //字符串 一定包含‘\0’,也只有包含'\0'才能称为字符串
char frr[4] = {'a','b','c','d'}; //不是字符串,因为没有‘\0’
char hrr[5] = {'a','b','c','d'}; //是字符串 有'\0'
char类型:它的对象的字面值表现被一对单引号包围的单个字符。
五、字符函数
str2 = str1; //erro 数组不能整体赋值,而要单个赋值
六、一些小知识
1、a = 50; //左值 写权限
b = a; //右值 读权限
2、&a //取a的地址,取地址符为单目运算符
3、位:"位(bit)"是电子计算机中最小的数据单位。每一位的状态只能是0或1。
字节:8个二进制位构成1个"字节(Byte)",它是存储空间的基本计量单位。1个字节可以储存1个英文字母或者半个汉字,换句话说,1个汉字占据2个字节的存储空间。
4、1B(字节) = 8bites
5、2^10B = 1k; 2^20B = 1M; 2^30B = 1G; 2^32B = 4G
CPU OS(operating system) VS(编译器)
64bites 32/64bites 32/64biites
32bites的平台————2^32 = 4G的内存(VS)
考 32bites的平台有多少个字节的地址? 32/8 = 4B
64bites的平台有多少个字节的地址? 64/8 = 8B
6、求数组长度的标准公式:sizeof(arr)/sizeof(arr[0]) 不能写在子函数中 见代码4
sizeof(arr)/sizeof(int)————这个表示不好,若是double还得将int改为double
7、sizeof(int *) sizeof(char *) sizeof(double *) sizeof(int ****)
*只是表示地址,所以在32bites的平台上以上都是4个字节
8、不使用临时变量交换a,b的值,怎么交换?(腾讯笔试)
点击打开链接
七、代码
1、//字符数组 //字符串复制 void Mystrcpy(char *des,char *src)//1 { int i; for(i=0;src[i]!='\0';i++) { des[i] = src[i]; } des[i] = '\0'; } //字符函数 int main() { char str1[] = "abcde"; char str2[6] = "xyz"; char str3[100] = "haha"; //str2 = str1;//error,数组不能整体赋值 Mystrcpy(str2,str1); printf("%s\n",str2); //有如下的需求 //str2 = str1; //复制 //str3 += str1;//将新串链接到原串的后面 //str1 < str2 //比较大小 return 0; } 2、 //指针 void Fun(int *p) { p = NULL; } int main() { int a = 10; int *p = &a; //p = NULL;//NULL 是无效指针 Fun(p);//目的:同上 p=NULL;一样的效果。todo 问题:1,为什么不可以;2、如果想要一样该怎么改 printf("%d,%d\n",p,*p);//0 return 0; } 3、指针 void Swap_err1(int a,int b)//只修改形参值 { int tmp = a; a = b; b = tmp; //printf("%d,%d\n",a,b); } void Swap_err2(int *p1,int *p2)//传指针但没有解引用,只修改形参的值 { int *tmp = p1; p1 = p2; p2 = tmp; } void Swap_err3(int *p1,int *p2)//野指针 { int *tmp;//野指针,悬挂指针,没有访问权限 *tmp = *p1;//崩溃 *p1 = *p2; *p2 = *tmp; } void Swap(int *p1,int *p2)//子函数的改变要想影响到父函数:1、传指针;2、解引用 { int tmp = *p1; *p1 = *p2; *p2 = tmp; } int main() { int a = 10; int b = 20; printf("%d,%d\n",a,b); /*int tmp = a; a = b; b = tmp;*/ //Swap(a,b); Swap(&a,&b); printf("%d,%d\n",a,b); return 0; } 4.求数组长度 void Show(int arr[10],int len)//int *arr, void Show(int *arr,int len) { //for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)//error for(int i=0;i<len;i++) { printf("%d ",arr[i]); } } int main() { int arr[10] = {};//初始化部分内容,剩余为0 //for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++) //{ // printf("%d ",arr[i]); //} Show(arr,sizeof(arr)/sizeof(arr[0])); return 0; }