一维数组、指针、字符数组、字符函数
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;
}
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;
}
相关文章推荐
- c_指针_一维数组名作为函数参数
- 一道二级C题引发的思考-- c++函数传递指针的本质 与 字符串指针与字符数组的区别
- C程序设计语言- 指针与数组-4.2----字符指针与函数、指针数组以及指向指针的指针、指针数组的初始化
- 函数内 声明一个字符数组和一个指向字符串数组的指针 区别
- 一维数组、二维数组、字符数组、指针 相关的 sizeof 计算
- 关于函数字符数组调用的问题(没有搞清指针的概念)
- 关于一维数组、二维数组、一级指针、二级指针、指针数组、数组指针、空指针、字符指针、const的个人理解
- 笔试题-输入一个字符数组将这些字符串按顺序合并输出-指针数组-数组指针-函数指针-指针函数
- 函数内返回字符数组和字符指针的问题
- C++ 指针 数组指针 二维数组与指针 直接解释底层 各种指针(字符指针,函数指针,数组指针)解释
- 每日一C,指向一维、二维数组的指针及数组作为函数形参的思考(二)
- 关于指针和函数和字符数组的一些小结
- 编写函数,用指针将一维数组中的元素从大到小排序
- 数组与字符串、字符指针与其他类型指针、赋值参数、指针参数以及引用参数、函数指针
- 指针的相关运算,包括一维数组、二维数组、字符数组的sizeof、strlen运算
- C语言学习6 :指针的定义,指针类型要合法,指针要初始化,指针做函数参数,数组和指针的通用性,指针+1所代表的空间,void * 指针,交换函数中的指针,数组和字符型指针区别,字符型指针的应用,使用指针完成字符操作函数
- Delphi 字符、字符串、字符数组和字符指针及其相关函数
- 【C】【笔记】《C和指针》 第六章 指针 第七章 函数 第八章 数组 第九章 字符串、字符和字节
- strcmp函数只能对字符指针(变化的地址)或数组名(固定的地址)进行比较asc2码
- 10.6 分别用字符数组和字符指针作函数参数两种方法编程实现在字符串每个字符间插入一个空格的功能