`

C语言基础七

    博客分类:
  • c
c 
阅读更多

指针变量用来记录地址数据,可以通过指针变量找到其他变量。
指针变量声明方法如下
int *p_value = NULL, *p_value1 = NULL;
其中p_value和p_value1是指针变量名称,*表示变量是指针类型,int表示通过这两个指针变量可以找到整数类型数据。NULL是空地址,所有不能使用的指针变量都应该记录空地址。

指针变量占有4个字节的空间
指针变量的类型和地址数据所对应的变量类型不一定一致

当一个函数需要对其他函数的变量进行操作而不仅仅操作数据,这时就应该使用地址作为参数,形参应该声明成指针类型。

如果希望一个函数的返回值代表一个变量而不仅仅一个数字的话就应该使用变量地址作为返回值,返回值类型应该声明成指针类型。
局部变量的地址不能作为函数的返回值

void*类型的指针可以用来记录任意来源的地址数据,这种指针在使用之前要先强制类型转换成特定类型指针。

记录无效地址的指针叫做野指针,无法把野指针和正常指针区分开。
1.没有初始化的指针
2.地址数据对应的变量已经超过了生命周期
3.堆中变量被销毁,指针中仍然记录他们的地址

NULL叫做空地址,它就是数字0。记录空地址的指针叫做空指针。

字符串是由一组连续的字符构成的,我们用第一个字符的地址表示它们。所有字符串必须以'\0'作为结尾。

可以使用双引号中间的一组字符表示字符串,这种表示方法叫做字面值。gcc在编译字面值的时候会把它转换成首字母地址并且自动在后面加上'\0'字符。在运行的时候这种字符串被放置在一个特定的段落里,这个段落是不可以修改的。相同的字面值在程序运行的时候对应着同一个字符串。两个连续的字符串字面值会被合并成一个。

字符数组也可以用来表示字符串,必须保证以'\0'作为结束字符。

使用printf函数可以把一个字符串显示在屏幕上,要使用%s作为占位符。也可以使用scanf函数从键盘读一个字符串,但是有可能会出现溢出问题。fgets函数可以保证安全的从键盘读入一个字符串,有可能会把最后的'\n'字符也读入到字符数组中。

为了使用C语言中的字符串函数需要包含头文件string.h
strlen函数可以获得字符串中有效字符的个数
strcat函数可以把两个字符串合并成一个,strncat函数可以避免合并过程中的溢出
strcpy函数可以实现字符串的赋值操作,strncpy函数可以避免赋值过程中的溢出
strcmp函数可以比较两个字符串的大小,strncmp函数只比较前几个字符



/*
	地址数据练习
*/
#include <stdio.h>
int main() {
    int value = 0;
	 int values[] = {1, 2, 3};
	 printf("&value是%p\n", &value);
	 printf("values是%p\n", values);
	 printf("*values是%d\n", *values);
    return 0;
}


/*
	指针变量练习
*/
#include <stdio.h>
int main() {
    int value = 0;
	 int values[] = {1, 2, 3};
	 int *p_value = NULL, *p_value1 = NULL;
	 p_value = &value;
	 *p_value = 3;
	 printf("value是%d\n", value);
    p_value = values + 2;
	 *p_value = 7;
	 printf("values[2]是%d\n", values[2]);
    return 0;
}


/*
	数字交换练习
*/
#include <stdio.h>
int main() {
    int value = 3, value1 = 7;
	 int value2 = 0;
	 int *p_value = &value, *p_value1 = &value1, *p_value2 = &value2;
	 /*value2 = value1;
	 value1 = value;
	 value = value2;*/
    *p_value2 = *p_value1;
	 *p_value1 = *p_value;
	 *p_value = *p_value2;
	 printf("value是%d,value1是%d\n", value, value1);
    return 0;
}



/*
	指针变量练习
*/
#include <stdio.h>
int main() {
    int values[] = {1, 2, 3};
	 int *p_value = values;
	 char *p_char = (char*)values;
	 printf("sizeof(p_value)是%d,sizeof(*p_value)是%d\n", sizeof(p_value), sizeof(*p_value));
	 printf("sizeof(p_char)是%d,sizeof(*p_char)是%d\n", sizeof(p_char), sizeof(*p_char));
    return 0;
}


/*
	指针练习
*/
#include <stdio.h>
int main() {
    int values[] = {1, 2, 3, 4};
	 int *p_value = values, loop = 0;
	 for (loop = 0; loop <= 3; loop++) {
        //printf("%d ", values[loop]);
        //printf("%d ", p_value[loop]);
        //printf("%d ", *(p_value + loop));
        printf("%d ", *p_value);
		  p_value++;
	 }
	 printf("\n");
    return 0;
}


/*
	指针参数练习
*/
#include <stdio.h>
void negs(int *p_values, int num) {
    int loop = 0;
	 for (loop = 0; loop <= (num - 1); loop++) {
        //p_values[loop] = 0 - p_values[loop];
        *(p_values + loop) = 0 - *(p_values + loop);
	 }
}
int main() {
    int values[] = {4, -9, 2}, loop = 0;
	 negs(values, 3);
    for (loop = 0; loop <= 2; loop++) {
        printf("%d ", values[loop]);
	 }
	 printf("\n");
    return 0;
}


/*
	指针参数练习
*/
#include <stdio.h>
void swap(int *p_value, int *p_value1) {
    int tmp = *p_value;
	 *p_value = *p_value1;
	 *p_value1 = tmp;
}
int main() {
    int value = 3, value1 = 7;
	 swap(&value, &value1);
	 printf("value是%d,value1是%d\n", value, value1);
    return 0;
}


/*
	指针参数练习
*/
#include <stdio.h>
void square(int *p_value) {
    *p_value *= *p_value;
}
int main() {
    int value = -3;
	 square(&value);
	 printf("value是%d\n", value);
    return 0;
}



/*
	指针练习
*/
#include <stdio.h>
int *max(int *p_value, int *p_value1) {
    if (*p_value > *p_value1) {
        return p_value;
	 }
	 else {
        return p_value1;
	 }
}
int *f() {
    int value = 0;
	 return &value;    //局部变量地址不能作为函数返回值使用
}
int main() {
    int value = 3, value1 = 7;
	 int *p_value = max(&value, &value1);
	 printf("*p_value是%d\n", *p_value);
    return 0;
}


/*
	void*指针练习
*/
#include <stdio.h>
int main() {
    int value = 3;
	 char ch = 'a';
	 float f = 4.6f;
	 void *p_value = &value;
	 *(int*)p_value = 7;
	 p_value = &ch;
	 *(char*)p_value = 'z';
	 p_value = &f;
	 *(float*)p_value = 1.5f;
    return 0;
}


/*
	字符串练习
*/
#include <stdio.h>
int main() {
    char *p_str = "abc";
	 char *p_str1 = "abc";
	 char *p_str2 = "abc""xyz";
	 //*p_str = 'z';
	 printf("*(p_str + 3)是%d\n", *(p_str + 3));
	 printf("p_str是%p,p_str1是%p\n", p_str, p_str1);
	 printf("*(p_str2 + 3)是%c\n", *(p_str2 + 3));
    return 0;
}


/*
	字符串练习
*/
#include <stdio.h>
int main() {
    char *p_str = "abc";
	 char *p_str1 = "abc";
	 char *p_str2 = "abc""xyz";//"" 略过
	 //*p_str = 'z';
	 printf("*(p_str + 3)是%d\n", *(p_str + 3));//0
	 printf("p_str是%p,p_str1是%p\n", p_str, p_str1);//一样
	 printf("*(p_str2 + 3)是%c\n", *(p_str2 + 3));//x
    return 0;
}

/*
	字符串练习
*/
#include <stdio.h>
int main() {
    //char str[] = "abc";
    //char str[3] = "abc";  //‘\0’丢失
    char str[] = {'a', 'b', 'c', '\0'};
	 printf("sizeof(str)是%d\n", sizeof(str));
	 str[1] = 'y';
    return 0;
}


/*
	字符窜练习
*/
#include <stdio.h>
int main() {
    char buf[10];
	 //scanf("%s", buf);
	 fgets(buf, 10, stdin);
    printf("%s\n", buf);
    return 0;
}


/*
	字符串函数练习
*/
#include <stdio.h>
#include <string.h>
int main() {
    char buf[20] = "abc";
	 char *p_str = NULL;
    printf("字符串长度是%d\n", strlen("abcdef"));
    p_str = strcat(buf, "xyz");
	 printf("合并后的字符串是%s\n", p_str);
	 p_str = strcpy(buf, "hello");
	 printf("复制后的字符串内容是%s\n", p_str);
	 printf("比较结果是%d\n", strcmp("abc", "abd"));
	 printf("比较结果是%d\n", strcmp("abd", "abc"));
	 printf("比较结果是%d\n", strcmp("abc", "abc"));
    return 0;
}



/*
	模拟登陆练习
*/
#include <stdio.h>
#include <string.h>
int main() {
    char buf[20];
	 int loop = 0;
	 for (loop = 0; loop < 3; loop++) {
        printf("请输入用户名:");
		  fgets(buf, 20, stdin);
		  if (strcmp(buf, "admin\n")) {
            continue;
		  }
		  printf("请输入密码:");
		  fgets(buf, 20, stdin);
		  if (!strcmp(buf, "123456\n")) {
            break;
		  }
	 }
	 if (loop < 3) {
        printf("登陆成功\n");
	 }
	 else {
        printf("登陆失败\n");
	 }
    
    return 0;
}



0
0
分享到:
评论

相关推荐

    C语言基础,详细讲解C语言的基础知识

    一九七八年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。同时由B.W.Kernighan和D.M.Ritchit合著了著名的“THE C PROGRAMMING LANGUAGE”一书。通常简称为《K&R》,也有人称之为《K&R》标准。但是,在《K&R...

    c语言基础知识总结.doc

    总体上必须清楚的: 1)程序结构是三种: 顺序结构 、选择结构(分支结构)、循环结构。 2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做...7、逗号运算符的级别最低,赋值的级别倒数第二。

    C语言基础学习ppt课件

    C语言基础课件对初学C语言者很有帮助,里面课件含有: 1.程序设计基础 2.数据类型 3.循环语句 4.数组 5.函数 6.指针 7.预处理命令 8.文件操作 9.结构体

    C语言基础教程 课件

    C 语言基础教程 第一章 C语言概述 第二章 程序的灵魂-算法 第三章 数据类型、运算符与表达式 第四章 顺序程序设计 第五章 选择结构程序设计 第六章 循环控制 第七章 数组 第八章 函数 第九章 预处理命令 第十章 ...

    C语言基础教程3输入输出函数及控制流程语句[汇编].pdf

    C语言基础教程3输入输出函数及控制流程语句[汇编].pdf

    c语言基础练习.7z

    c语言基础练习.7z

    C语言教学课件 C语言基础

    第一章 C语言概论 第二章 C语言基础 第三章 C语言的基本控制结构 第四章 数 组 第五章 指 针 第六章 函 数 第七章 结构与联合 第九章 文 件

    C语言基础(Day7)思维导图

    C语言基础(Day7)思维导图

    C语言基础试题及答案

    压缩包里共包含七套选择题,每套10题,包含答案。

    C语言基础知识

    double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多 scanf函数,与printf函数一样,都被定义在头文件stdio.h里,因此在使用scanf...

    C语言基础教程TXT

    7.8.7 随机数发生器函数 第8章 UNIX系统界面 8.1 文件描述符 8.2 低级I/O—read和write系统调用 8.3 open、creat、close和unlink系统调用 8.4 随机访问—lseek系统调用 8.5 实例—fopen和getc函数的一种实现 ...

    C语言教室 C语言基础课程

    第一章: C语言概论 第二章: 数据类型、运算符、表达式 第三章: C语言程序设计...第七章:结构与联合 第八章:枚举,位运算 第九章:预处理 第十章:文件 附录一:Turbo C(V2.0)编译错误信息 附录二:Turbo C(V2.0)使用指南

    C语言基础入门视频.txt

    本文是txt文本里面有网盘永久链接视频,C语言基础,包括:002第二章 数据类型,运算符和表达式01,007第三章 顺序程序设计01,014第四章 分支结构程序05,016第五章 循环控制结构程序01,027第六章 数组05,032第七章 ...

    第二章 c语言基础 (7).ppt

    第二章 c语言基础 (7).ppt

    【C语言基础语法用例+两个基础实战游戏代码解析】.docx

    # C语言基础语法用例教程 本教程将为您介绍C语言的基础语法的使用案例知识。 ## 目录 1. [简介](#简介) 2. [变量和数据类型](#变量和数据类型) 3. [运算符](#运算符) 4. [控制流程](#控制流程) 5. [函数](#函数) ...

    C语言教程ppt C语言基础知识考试教程学习资料.rar

    C语言教程ppt C语言基础知识考试教程学习资料:CC1-预备知识 .PPTCC10-结构体.PPTCC2-VC++开发环境.pptCC3-C语言概述.PPTCC4-数据描述.PPTCC5(1)数据输入与输出.PPTCC5(2)程序流程设计.PPTCC6-数组.PPTCC7-函数....

    C语言课堂App【免费C语言学习交流】

    3、将复杂的C语言基础和编程技能,通过生活化实例方式,使内容浅显易懂,采用边学边练的最优教学模式,让同学们尽快理解知识、掌握技能、提升编程能力; 4、搭建一个纯粹C语言免费考试学习环境,让大家更熟悉C语言...

    C语言基础知识教程、心得、源码示例讲解文档

    2.C语言基础: 数据类型、变量、常量、运算符、表达式等基础知识。 3.流程控制: 详解if、switch、for、while等条件与循环语句。 4.函数: 学习函数定义、函数声明、函数的调用等内容。 5.数组、字符串和指针: 掌握数组...

    C语言 0基础学习笔记

    7. 一个存储位置只能存储一种类型的数据,因此变量也是有类型的。 8. 为了向变量中放置一个数字需要使用赋值语句. 9. 赋值操作符(=)是赋值语句的核心. 10. 赋值操作符左边必须是一个能代表存储位置的东西(左值)...

    非常好的C语言基础项目资源,分享出来.zip

    c语言基础 . ├── C language │ ├── C语言函数库详解.docx │ ├── C语言深度解剖 │ │ ├── C语言深度解剖(第2版)解开程序员面试笔试的秘密 PDF电子书下载 带书签目录 完整版.pdf │ │ ├── C语言...

Global site tag (gtag.js) - Google Analytics