您的位置:首页 > 编程语言 > C语言/C++

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

2020-03-31 07:42 253 查看
//第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;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
猪孩 发布了11 篇原创文章 · 获赞 0 · 访问量 280 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: