指针入门与字符类型

目录

指针

取地址运算

初识指针

 指针与数组

字符类型

char字符

逃逸字符


指针

取地址运算

sizeof

代表int在内存中代表四个字节,32个比特

运算符

获得变量的地址,它的操作数必须是地址

 取地址的对象必须是明确的变量,如果右边不是一个变量,而是&(a+b)

试试用&输出变量的地址,相邻的变量的地址, 

 9C与98多了四个字节(十六进制)

i是先定义的变量,放在更高的地方,在stack中分配内存是自顶向下分配的

 &a和a和&a[0]是相等的,找到的是同一位置

初识指针

就是保存地址的变量。普通变量的值是实际的值,而指针变量的值是具有实际值的变量的地址。

int i;

int* p= &i;  //*号表示p是一个指针,指向的是一个int,用&i把i的地址交给p

int* p,q;

int *p,q;       

以上两种情况中*号远离或靠近p都表示p是一个指针,而后面的q只是一个int变量,如果想要表达q是一个指针,只需在写为*q。

作为参数的指针:

 

 

 指针与数组

#include<stdio.h>

void minmax(int a[],int len, int *max,int *min);

int main(void)
{
	int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55};
	int min,max;
	printf("main sizeof(a)=%lu\n",sizeof(a));
	minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
	printf("min=%d,max=%d\n",min,max);

    return 0;
}

void minmax(int a[],int len, int *min,int *max)
{
	int i;;
	printf("minmax sizeof(a)=%lu\n",sizeof(a));
	*min = *max=a[0];
	for(i=1;i<len;i++){
		if(a[i]<*min){
			*min = a[i];
		}
		if(a[i]>*max){
			*max= a[i];
		}
	}
}

 可以看到,在main中a的大小为68,在minmax中a的大小为4(4刚好和一个指针的大小是一样的),对于函数参数里面的数组的sizeof,返回的是int *的sizeof,而不是int数组的sizeof

继续试验:在main和minmax中分别输出a的地址,如下

发现两个输出的结果是一样的,说明minmax中的a数组其实和main中的a数组是同一个数组。

进一步说明:

 因而得出结论:int a[]实际上就是指针,就算是改为int *a编译运行也是正确的。

以下四种函数原型是等价的:

int sum(int *ar,int n);

int sum(int *,int);

int sum(int ar[],int n);

int sum(int [],int); 

数组变量是特殊的指针。

这次只是从慕课C语言入门初步学习指针,下面这个挺详细的(大佬可以让我放到这里以后复习吗?不过你应该看不到,我就默默放在这了,谢谢)

 让你不再害怕指针——C指针详解(经典,非常详细)_程序老兵的博客-优快云博客_指针

字符类型

char字符

char是一种整数,也是一种特殊的类型:字符。这是因为:

用单引号表示的字符字面量:'a','1'

"也是一个字符,printf和scanf里用%c来输入输出字符,试验如下:

 

 

空格算一个字符,两个字符相减得到它们在表中的距离。 

大小写转换:

字母在ASCII表中是顺序排列的

大写字母和小写字母是分开排列的,并不在一起

'a'-'A'可以得到两段之间的距离,于是

    a+'a'-'A'可以把一个大写字母变成小写字母,而a+'A'-'a'可以把一个小写字母变成大写字母

一道作业OJ题:

#include<stdio.h>

int main(void)
{
	int letter,blank,digit,other,n;
	char ch;
	digit = letter = other = blank =0;
	
	scanf("%d",&n);
	getchar();
	
	int i;
	for(i = 1;i<=n;i++){
		ch = getchar();
		if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))letter++;
		else if(ch>='0'&&ch<='9')digit++;
		else if(ch==' '||ch=='\n')blank++;
		else other++;
	}
	getchar();
	printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
	return 0;
 }

逃逸字符

 \b使程序回退一格,退到

之前存放b的位置,A就占领了这个位置。

制表位是每行的固定位置,一个\t使得输出从下一个制表位开始,用\t才能使得上下两行对齐。如上

        部分整理自慕课网“程序设计入门——C语言”课程,部分文字及图片来自原课程

                                                                                                                          如有错误,欢迎纠正

                                                                                                                       如有侵权,请联系删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值