程序设计入门-C语言 翁恺 第8周 指针与字符串

//第8周指针与字符串 
//sizeof
#include<stdio.h>
int main()
{
	int a;
	a=6;
	printf("sizeof(int)=%ld\n",sizeof(int));      //sizeof(double)
	printf("sizeof(a)=%ld\n",sizeof(a));          //sizeof(a)     
	printf("sizeof(double)=%ld\n",sizeof(double));//sizeof(int)
	return 0;
} 
 
//& 取地址符 操作数必须是变量
#include<stdio.h>
int main(void)
{
	int i = 0; //本地变量分配在内存stack,自顶向下
	int p;
	p = &i; 
	printf("0x%x\n",&i);  //&i是地址不应该用%x  用地址%p 
	printf("%p\n",&i); // 用地址%p 地址格式占位符  ,输出地址
	printf("0x%p\n",&i); // 用地址%p 
	printf("%p\n",p);
	printf("%p\n",&p);//自顶向下,差4个字节 
	printf("%x\n",p);
	printf("%lu\n",sizeof(int));
	printf("%lu\n",sizeof(&i));  //地址8个字节
	return 0;
} 

//& 取地址符 数组的地址 
#include<stdio.h>
int main(void)
{
	int a[10];
	printf("%p\n",&a);
	printf("%p\n",a); //数组名代表地址
	printf("%p\n",&a[10]);//下标越界 
	printf("%p\n",&a[0]);
	printf("%p\n",&a[1]);
	return 0;
}  

//& 取地址符 *p是一个int
#include<stdio.h>
void f(int *p);
void g(int k);
int main(void)
{
	int i =6;
	printf("&i=%p\n",&i);
	f(&i); //
	g(i);
	return 0;
} 
void f(int *p)
{
	printf("p=%p\n",p);
	printf("*p=%d\n",*p);   //*p==i
	*p=26;  //写 对i做的
}
void g(int k)
{
	printf("k=%d\n",k);
}

//找数组中最大的数输出 
#include<stdio.h>
void minmax(int a[],int len,int *min,int *max);  //函数参数表中的数组实际上是 指针 
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));
	printf("main a=%p\n",a);
	minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
	printf("a[0]=%d\n",a[0]);
	printf("min=%d,max=%d\n",min,max);
	int *p = &min;
	printf("*p=%d\n",*p);
	printf("p[0]=%d\n",p[0]);  //把p所指的地方当做一个数组 
	printf("*a=%d\n",*a);//*也可以对数组做 
	return 0;
}
void minmax(int a[],int len,int *min,int *max)  //函数参数表中的数组实际上是 指针  int *a
{
	int i;
	printf("minmax sizeof(a)=%lu\n",sizeof(a));
	printf("minmax a=%p\n",a);
	a[0] = 1000;
	*min = *max =a[0];
	for(i=1;i<len;i++){
		if(a[i] < *min){
			*min = a[i];//当做数组来用它
		}
		if(a[i]>*max){
			*max = a[i];
		}
	}
}


/*int isPrime(int x,int knownPrimes[],int umber0fKnownPrimes)
{
	int ret = 1;
	int i;
	for(i=0;i<number0fKnowPrimes;i++)
	{
		if(x%knownPrimes[i] == 0){
			ret = 0;
			break;
		}
	}
	return ret;
} 

//数组变量可以被看做是const的指针
数组不同于指针。

数组只有被作为参数传入到另一个函数里时,才等同于const指针。

因为直接对数组做sizeof,是可以得到总的字节数,而当数组被传入另外一个函数里使用时,就不能再使用sizeof获得总的字节数了。
数组名在参数传递中可以退化为指针,但它本身是一个地址常量而不是地址变量*/

#include<stdio.h>
int main()
{
	int a[]={1,2,3,4};
	int *const p = a; //
	printf("sizeof(a)=%lu\n",sizeof(a));
	printf("sizeof(p)=%lu\n",sizeof(p));
	printf("sizeof(&p)=%lu\n",sizeof(&p));
	return 0; 
	
}
/*数组的sizeof和const指针的sizeof不相同,sizeof(p)得到的是存放指针的地址的长度,
sizeof(a)得到的是存放数组的地址的总长度 */
/*理解: 数组变量是指 数组这种数据结构,sizeof(数组名)返回的是数组整体占据的内存大小;
而sizeof(指针)得到的是指针所对应地址的大小 
*/ 
//数组变量可以被看做是const的指针 
#include<stdio.h>
int main()
{
//const的指针是 指其指向的值可以改变,其地址不变
//围绕对指针的相关运算展开

	int a[5]={0,1,2,3,4};
	int *const p = a;//令p指向a 
	printf("sizeof p = %d\n",sizeof(p));//p=8,是指针变量的长度
	printf("sizeof a=%d\n",sizeof(a));//a=20,是整个数组的长度
	//值 
	printf("*p = %d\n",*p);  //*p=0 
	printf("*a = %d\n",*a);  //*a=0
	*p=1000;
	*a=1000;
	printf("*p=%d\n",*p);//*p=1000
	printf("*a=%d\n",*a); //*a=1000
	//地址
	printf("p=%p\n",p);//p=0x10000
	printf("a=%p\n",a);//a=0x10000//数组可以看作是const的指针 
	return 0; 
}
//数组变量可以被看做是const的指针 
#include<stdio.h>
int main()
{
	int *a;
	int b[9];
	int c =0;
	a = &c;
	b = &c;//不能给数组变量赋值一个地址 
	printf("%p%p",a,b);
	return 0;
}

 //8.2字符类型 character
#include<stdio.h>
int main()
{
	char c;
	char d;
	c=1;
	d='1';
	if(c==d){
		printf("相等\n"); 
	}
	else{
		printf("不相等\n"); 
		}
	printf("%d\n",c);
	printf("%d\n",d);
	scanf("%c",&c);
	printf("c=%d\n",c);
	printf("c='%c'\n",c);
	return 0;
}
//字符类型 
#include<stdio.h>
int main()
{
	char i;
	char c;
	scanf("%d%c",i,c);
	printf("i=%d,c=%d,c=%c",i,c,c);
	scanf("%d %c",i,c);  //有空格和无的区别 
	printf("i=%d,c=%d,c=%c",i,c,c);
	return 0;
}
//字符计算
char c='A';
c++;
printf("%c\n",c);

int i='Z'-'A';
printf("%d\n",i); 
//字符类型 逃逸字符 转义字符
#include<stdio.h>
int main()
{
	printf("123\bA\n456\n");//\b退一格 
	return 0;
}
//字符类型 逃逸字符
#include<stdio.h>
int main()
{
	printf("123\t456\n");
	printf("12\t456\n");  //  /t到下一个表格位 
	return 0;
}
//8.3字符数组 不是字符串  字符串变量
#include<stdio.h>
int main()
{
	int i =0;
	char *s ="Hello Word";
	//s[0]='B';  //地址小,代码段,代码只读 
	char *s2 ="Hello World";
	char s3[] = "Hello World";
	printf("&i=%p\n",&i);
	printf("s=%p\n",s);
	printf("s2=%p\n",s2);
	printf("s3=%p\n",s3);
	s3[0]='B';
	printf("Here!s[0]=%c\n",s[0]);
	printf("Here!s3[0]=%c\n",s3[0]);
	return 0;
}
//8.4
/*字符串计算 字符串的输入与输出 */
#include<stdio.h>   
int main()
{
	char word[8];  //输入hello world 
	char word2[8];  //输入 12345678
	scanf("%7s",word); //scanf(“%s”,word);读入一个单词
	scanf("%7s",word2);//地址
	printf("%s##\%s##\n",word,word2); //##能看到结尾的边界在哪 
	return 0;
}
/*字符串长度strlen */
#include<stdio.h> 
#include<string.h>  
int main(int argc,char const *argv[])
{
	char line[]="Hello";
	printf("strlen=%lu\n",strlen(line)); //长度 
	printf("strlen=%lu\n",sizeof(line));
	return 0;
}
/*比较字符串strcmp */
#include<stdio.h> 
#include<string.h>  
int main(int argc,char const *argv[])
{
	char s1[]="abc";
	char s2[]="Abc";   //S1==S2表达是她们是否是相同的地址 
	printf("%d\n",strcmp(s1,s2)); // == 0;   >  1 ; <  -1;
	printf("%d\n",'a'-'A');
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值