您的位置:首页 > 其它

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

2017-08-06 15:39 218 查看
一、一维数组

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 +
4000
= 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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  指针 数组
相关文章推荐