一维数组、指针、字符数组、字符函数

xiaoxiao2021-02-28  104

一、一维数组

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; }

转载请注明原文地址: https://www.6miu.com/read-50860.html

最新回复(0)