数据结构知识点辨析(一)
本文重点梳理总结一些容易忘的、容易混淆的小零碎知识点,希望对你有帮助!
非字符数组
double sales[5] = {12.25, 32.50, 16.90, 23, 45.68};
double sales[ ] = {12.25, 32.50, 16.90, 23, 45.68};
int list[5] = { 6, 5, 12 }; //相当于: int list[5] = {6,5,12,0,0};
int list[5] = {0}; //最常用的初始化数据组元素为0的方式
字符数组
char string[10] = “hello”;
char string[10] = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’};
char string[ ] = “hello”;
第一种: 字符串常量,显式长度。(编译器会自动加‘\0’ ,所以长度要比字符串长度加一 )
第二种: 单个赋值,手动加‘\0’
第三种: 字符串常量,隐式长度。(编译器自动加‘\0’)
字符指针
一、字符串常量
对于字符串常量“hello”,可以把它堪称一个无名字符数组,编译器会自动给它分配空间存放这个常量,字符串常量的值是指向这个无名字符数组的第一个字符的指针,类型是字符指针。因此,printf(“hello”); 传递给函数的是指向第一个字符的指针。
由此可推断出:
char s[]="hello";
char *p; //字符指针类型
p=&s[0]; //或者写成 p=s;
printf(p);
可以得到与 printf(“hello”); 一样的结果。
二、字符指针与字符数组
1、赋值PK
char *char_ptr , word[20] ;
char_ptr = " point to me " ;
👆把指向第一个字符的指针赋值给指针变量-----正确
word = " you can’t do this " ; //更正:strcpy(word,“……”);
👆直接把字符串常量赋给字符数组名------错误(word是个常量,不能赋值)
2、改值PK
char a[ ] = " hello " , *p = " hello " ;
a[0] = ’ b ’ ;
👆直接更改字符数组某一个位置的值------正确
p = ’ b ’ ;
👆直接改p------错误(*p是常量,不能修改常量值)
数组名
数组名是常量指针,不能改变。
一维
int a[5] = {0,1,2,3,4};
其中a是指向0的整型指针,a+1指向1,a+2指向2……
二维
char a[4][5] = { “abcd”, “efgh”, “ijkl”, “mnop” };
其中的a只能写加几,不能++,因为它自己不能变
指针数组VS数组指针
指针数组
char *a[10]; //由指向字符的指针构成的数组
int *b[10]; //由指向整型的指针构成的数组
……//指向各种类型
👆里面每个格子里存的都是指向字符类型的指针
注:也可以写为char *(a[10]);
数组指针
char (*a)[10]; //指向字符数组的指针
……//指向各种类型
👆里面每个格子里存的都是字符,a指向这个数组的首地址,可以用a遍历访问数组内容,作用和数组名差不多,但这里的a可以++,是变量