C语言中 字符、数组、字符串、指针——学习IOS你必须了解

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、char类型

1、内存存储:对应于ASCII码表存储
字符 ASCII码值 内存存储
A    65        0100 0001
B    66        0100 0010
C    67        0100 0011
a    97        0110 0001                                 
2、char类型使用注意
1>.单引号'只能括住单字节字符,不能是汉字
2>.注意不要把单引号写为双引号,也不要忘记单引号括起来
3>.可以写为char c=65;//char c='A';  
练习
写一个函数,将小写字母转为大写

#include<stdio.h>                     
char upper(char c){
//如果是小写字母,就转为大写
if(c>='a'&&c<='z'){
return c-(‘a’-‘A’);
}//如果不是小写字母,返回本身
return c;
}
int main(){
char cc=upper('a');
printf("%c\n",cc);
return 0;
}

二、数组
1、定义:存放一组数据,这组元素应具有同一种类型            
格式:
类型 数组名[元素个数];例:
int age[50];数组元素下标从0开始,即age[0]、age[1]、age[2]、age[3]、age[4]......age[49]
也可以定义为 :类型 数组名[元素个数]={X,X,X,......};此种方式只要没有赋值的元素默认为0
几种常见的数组初始化方法:
int age[5]={1,2,3,4,5};//每一个元素都赋值
int age[]={1,2,3};//确定只有3个元素
int age[5]={1,2};//只有前2个元素赋值,后面元素默认为0
int age[5]={[3]=4,[4]=5};//直接给第三个元素赋值为4,第四个元素赋值为5
int age['A']=int age[65];
int age['A'-60]=int age[5];
int age[];//错误初始化
int age[n];int n=5;//错误初始化,中括号里面只能是常量,不可以是变量
int age[n];int n=5;age[0]=1;age[2]=1;age[3]=1;但是此种是正确初始化方法
2、遍历:按顺序查看每一个元素
for(int i=0;i<5;i++){
printf("age[%d]=%d\n",i,age[i]);
}
3、求数组元素个数
int age[]={1,2,3};
int count=sizeof(age)/sizeof(int);

4、求数组元素首地址、打印地址

//打印地址
for(int i=0;i<5;i++){
printf("age[%d]的地址是:%p\n",i,&age[i]);
}
注:数组作为函数参数可以省略元素个数,实际传递的是整个数组的地址,修改函数形参数组元素的值也会影响到外面的实参数组

练习
设计一个函数找出整型数组元素的最大值

#include<stdio.h>
int maxOfArrary(int array[],int length){
int max=array[0];//定义一个变量存储最大值,默认为首元素
for(int i=0;i<length;i++){
//遍历所有元素找出最大值
if(array[i]>max){
//如果当前元素大于max,就把当前元素覆盖max
max=array[i];
}
}
return max;
}
}
int main(){
int ages[]={81,75,14,145,45,79};
int max=maxOfArrary(ages,sizeof(ages)/sizeof(int));
printf("%d\n",max);
return 0;
}
5、二维数组
int age[3][50]={{},{},{}};//3个数组,每个数组有50个存储空间,即3 行50列
三 、字符串、字符串数组
1、初始化
\0的ASCII码值是0
char name[5]="it";==
char name[5]={'i','t','\0'};==
char name[5]={'i','t',0};==
char name[5]={'i','i'};
2、字符串的长度后面隐藏一个\0,所以长度+1
输出用%s,遇到第一个\0结束,\0是字符串结束的标志、
一个汉字是3个字符
#include<stdio.h>
int main(){
char name[]="it";
char name2[]={'o','k'};
printf("%s\n",name2);//输出为okit
printf("%s\n",%name2[1]);//输出为ok
return 0;
}
3、strlen函数:计算字符串长度
#include<string.h>//strlen函数声明在string.h文件中
#include<stdio.h>
int main(){
char name[]="itcast";
char name2[]={'0','\0','6'};//遇到\0就结束
int size=strlen(name2);
printf("%d\n",size);//只有一个字符'0',所以结果为1
//计算的字符不包括\0
return 0;
}

下边是该段代码段的图形表示


练习

编写一个函数char_contain(char str[],char c),如果字符串str中包含 字符c泽返回1,否则返回0
#include<string.h>
#include<stdio.h>
int main(){
int result=char_contain("itcast",'t')
printf("%d\n",result);
return 0;
}
第一种方法:用for循环
int char_contain(char str[],char c){
//遍历整个字符串
for(int i=0;i<strlen(str);i++){
if(str[i]==c){//如果发现字符c返回1
return 1;
}
}//说明str里面不包含字符c
return 0;
}
/*第二种方法:用while循环
int char_contain(char str[],char c){
//遍历整个字符串
int i=-1;
while(str[++i]){//因为字符串以\0结束而\0=0
if(str[i]==c){//如果发现字符c返回1
return 1;
}
}//说明str里面不包含字符c
return 0;
}*/
4、字符串数组
例:char names[2][10]={"jack","rose"};
printf("%s\n",names[1]);//访问"rose"
printf("%s\n",names[0][1]);//访问"jack"里面的'a'

四、指针
#include<stdio.h>
<pre name="code" class="cpp">viod change<span style="font-family: SimSun;">(int n);</span>
int main(){int a=90;change(a);printf("a=%d\n",a);return 0;}viod change(int n){n=10;}
 上面代码中执行后a的值依然是90,那么怎么把形参n的值传给实参a,这需 
 要用到指针 
  
 1、定义1>.格式:变量类型 *变量名2>.指针变量只能指向存储地址int *p;int a=90;p=&a;//指针变量p指向变量a*p=10;//a的值就变为10了,这时候*的作用是访问指针变量指向的存储空 
 间,不正确写法p=20 
  
 3>.使用注意,在使用之前一定要初始化4>.指针是什么类型就去对应字节的数据2、指针和数组的关系int ages[5];int *p;p=ages;数组元素的访问方式1>.数组名[下标]  age[i]2>.指针变量名[下标]  p[i]3>.*(p+i) 
  
 
#include<stdio.h>
int main(){
int ages[5]={9,4,5,6,8};
int *p;
p=&ages[0];//指向首元素
printf("%d\n",p[2]));
for(int i=0;i<5,i++){
printf("ages[%d]=%d\n",i,p[i]));
}
return 0;
}
3、指针与字符串
#include<stdio.h>
int main(){
char name[]="it";//字符串变量
char name2="it";//指针name2指向字符串首地址
printf("%s\n",name2);//全部输出
printf("%c\n",*name2);//只输出首字符
return 0;
}
*内存:常量、堆(存放对象)、栈(存放局部变量)
*定义字符串的2种方式
1>.利用数组
char name[]="it";//字符串里面的字符,可修改
2>.利用指针
char *name="it";//字符串是一个常量字符串,不可改

*字符串数组
char *names[5]={"ada","ewwrfw","qwds"};//一维字符串数组
char *names[5][10]={"ada","ewwrfw","qwds"};//二维字符串数组
4、指向函数的指针
*定义

#include<stdio.h>
void test(){
printf("调用了test函数\n");
}
int main(){
//(*p)是固定写法,代表指针p指向的函数,右边的()代码指针p指向的函数没有形参
void (*p)();
p=test;//指针p指向test函数
p();或者(*p)();间接调用函数
test();//直接调用函数
return 0;
}




















































  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值