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

来源:互联网 发布:微信内置浏览器js跳转 编辑:程序博客网 时间:2024/06/07 06:54

一、一维数组

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


原创粉丝点击