C语言笔记_第八章

一、指针
1.&运算的作用是或取变量的地址,并且它的操作对象必须是变量

scanf("%d",&<变量>);

eg:
我们这里输出一个变量的地址,换算为16进制,可以联想微机原理的寄存器读取(堆栈)。

#include<stdio.h>
int main(){
int x;
double y;
	printf("整形变量x所占据 %d Byte\n",sizeof(x));
	printf("整形变量x所占据 %d Byte\n",sizeof(y));
	printf("x单元所占据的地址为%p\n",&x);
	printf("y单元所占据的地址为%p\n",&y);
	/*这里输出的地址,是2进制和16进制的转换而已32位二进制地址,用16进制表示,每4位2进制转换为1位16进制,32/4=8同理64/4=16
	所以如果是64位(bit)机会输出16位16进制的地址x和y,但如果是32位的架构则输出8位,由于堆栈地址分配从高往下分配所以说这里
	x y变量x会对应高地址,y对应低地址。*/
int arry[10]={0,1,2,3,4,5,6,7,8,9};
	printf("array数组的地址(&array):%p\n",&arry);
	printf("array数组的地址(array):%p\n",arry);
	printf("array[0]数组单元的地址:%p\n",&arry[0]);//这里数组单元是变量 所以需要&符号
	printf("array[1]数组单元的地址:%p\n",&arry[1]);
return 0;
}

2.指针
指针类型的变量就是保存地址的变量

//指针的定义和赋值
int* p,q;//p是指针 q是int类型的变量  *p or * p
int *p,q;//p是指针 q是int类型的变量
int x=0;
int* p=&x;//将x的地址赋值给指针p

如上3~4行代码可以如下理解
指针
如果我们创建一个函数:

int x=0;
void f(int *p);//f函数被调用过的时候需要得到某个变量的地址
f(&x);//这里调用f函数会给它传入
/*在函数里面可以通过指针访问外面的x变量*/

为什么要用指针呢,因为当我们拥有变量的存储地址的时候我们就好比有了去往那个变量路径的钥匙,我们也就有了使用它的权限和能力。
3.如何访问地址上的变量
利用:“ * ” 号 (单目运算符) 利用*号我们就可以读取或修改相关变量 简单点说:可以做左值也可以做右值
eg:
我们这里利用 * 号进行对变量值的修改或者调用

#include <stdio.h>
void address(int *p);
void change(int z);

int main(){
	int x=11;
	address(&x);
	change(x);	
return 0;
}
void address(int *p){
	int y;
	y=*p;//*p为右值
	printf("函数得到的地址值是:%p\n",p);
	printf("*p的值:%d\n",*p);
	printf("y的值是%d\n",y);
	*p=24;//*p为左值
}
void change(int z){
	printf("x里面现在的值是%d\n",z);
}

4.数组指针
函数参数表里面的数组:array[] 实际上是int类型的指针。

void f(int array[])<=>void f(int *array)<=>void f(int *)<=>void f(int [])//这4个是等价的

数组变量本身是特殊的指针,也就是说数组变量本身表达地址

int array[10];
int *p=array;//不需要使用&取地址符
//而数组单元表达的是变量,需要用&取地址符号

数组变量是const的指针,所以不能被赋值

int array[]<=>int *const array

二、字符类型
1.char是一种整数,是一种特殊的类型:字符

#include <stdio.h>
int main(){
	char x='a';
	char y=1;//数字1
	char z='1';//字符1
	char a='a';//单引号 能够读取ASCII的值
	char A='A';
	char test;
	printf("字符类型变量x所能存储%dByte\n",sizeof(x));
	printf("字符类型x里面的字面量:%c\n",x);//%c输出输出char类型的字面量
	printf("字符类型y里面的字面量:%d\n",y);
	printf("字符类型z里面的字面量:%c\n",z);
	printf("字符类型z里面整数值:%d\n",z);//49 ASCII

	printf("字符类型a里面的整数值:%d\n",a);
	printf("字符类型A里面的整数值:%d\n",A);
	printf("///\n");
	printf("///字符的输入\n");
	printf("请输入字符:\n");
	scanf("%c",&test);
	printf("输出字符整数值:%d\n",test);
	printf("输出字符字面量:%c\n",test);
   	
   	int he;
   	printf("请输入数值:\n");
   	scanf("%d",&he);
   	printf("转换为字符:%c\n",he);
return 0;
}

2.大小写字母的准换

/*我们这里需要进行大小写字母的而转换*/
'a'-'A'//的到大写字母和小写字母之间的距离
<大写字母>+'a'-'A'// 我们可以完成大写字母转换为小写字母
<小写字母>+'A'-'a'//我们可以完成小写字母转换为大写字母

3.逃逸字符
用来表达无法印出来的控制字符或者特殊字符,它由一个反斜杠 \ 和一个其他字符组成,变成了另外一种字符
或者反斜杠n等等。

字符意义字符意义
\b回退一格\"双引号
\t下一个表格位\’单引号
\n换行\|反斜杠
\r回车
#include <stdio.h>
int main(){
	printf("This is a \"test\"\n");//这里输出双引号
	printf("123\t789\n");
	printf("12\t3789\n");
return 0;
}

三、字符串与字符串的计算
1.以0或者\0结尾的一串字符,0或者’\0’是一样的,但是和’0‘不同,0表示字符串结束,但不是字符串的一部分,计算
字符串从长度时不包含0,字符串以数组的形式存在,以数组或指针的形式访问,更多的是指针形式。

#include <stdio.h>
int main(){
	char *str1="hello word";
	printf("char *str1的字符是:%c",str1);
	char str2[]="hello word";
	char str3[20]="hello word";
	char str4[20]={'',};
	char str5 
	return 0;
}

2.字符串赋值

#include <stdio.h>
int main(){
	char *x="This is a string";
	char *y;
	y=x;
	printf("x指向的地址存储信息:%s\n",x);
	printf("y指向的地址存储信息:%s\n",y);
	
	char string[8];//最多存储7位后面还有\0
	printf("请输入字符串:\n");
	scanf("%7s",&string);//读入一个单词(到空格、tab或者回车为止 %7s:使输入最多7个字符多余的自动去除
	printf("储存字符串信息:%s\n",string);
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值