首页 > 其他分享 >C语言指针介绍加练习

C语言指针介绍加练习

时间:2024-06-12 20:04:28浏览次数:11  
标签:int 练习 C语言 char pc 地址 类型 指针

#指针相关介绍定义

       指针(Pointer),通常用于数据的间接访问,指针存储的是指向变量的首地址,16位平台就是2位,如果在32位平台,地址就是4个字节,如果实在64位平台,地址就是8个字节(1Byte = 8bit),Int 类型 4Byte  char 类型 1Byte 这个是变量在内存中,分配的地址大小,在内存中一个Byte一个地址,即Int类型有4个地址  char类型有一个地址,而指针指向的是,变量类型地址的首地址。

int main()
{
    int* pc = NULL;
    printf("pc = %d\n", sizeof(pc));
    return 0;//指针 pc 大小为8 Byte

}

        指针定义类型,指针定义为什么类型,与取地址变量类型一致,即,指针定义类型,应该与取地址变量类型一样(是为了保证,指针进行加减操作时,加减数值正确)。

int main()
{
    int int1 = 20;
    int *pc = & int1;//这里指针类型为 int*类型,因为a的类型为 int
    return 0;
}

        指针加一寄存器位置移动大小,应与指针类型一致,即  int  类型 +4   char 类型 +1 ,所以指针类型不能随便定义(int 类型变量在内存中,存储单元为4位,char 类型在内存中存储单元为1位)即指针++与--操作 加 | 减的是指针取地址变量类型的长度。

int main()
{
    int a = 10;
    char char1 = "1";
    int* pc = &a;//这里指针类型为 int*类型,因为a的类型为 int
    char* pb = &char1;
    printf("pc=%p\n", pc);
    printf("pb=%p\n", pb);
    
    printf("pc=%p\n", ++pc);//指针++加的是取地址变量类型长度 这里+4
    printf("pb++=%p\n", ++pb);//char类型+1
    return 0;
}

         指针类型不应该随便定义,在定义指针时,要进行指针初始化,没有进行指针初始化的指针是野指针,这种指针的地址是未知的。为了防止野指针的出现,如果不知道,指针定义为什么类型,该赋值,什么地址,就定义为空指针,因为空指针的地址是已知,的而只定义指针的类型而不定义,指针的取地址范围,这种指针称为野指针,同时地址范围也是未知的。

int main()
{
	int* pc = NULL;//这里将指针赋值为空指针
	printf("%p\n", pc);//指针内部存储的地址是0x0是确定的
}

        当使用指针时可以实现数据的间接访问,也就是通过指针访问取地址变量的值

int main()
{
    int a= 10;
    int*pc = &a;
    printf("%d\n",*pc);
    return 0;
}

#使用指针遍历数组

       指针的++与--操作经常用在数组,因为在系统内存中,访问数组数组时知道下一个,存储单元存放的内容是什么,如果不知道下一个存贮单元的内容是什么进行指针++操作,那么所得到的内容也是未知的,使用指针++ | --操作访问数组。

int main()
{
	char c[3] = {0x01,0x02,0x03};
	char* pc = &c;
	int i = 0;
	for (i = 0; i < 3;i++) {
		printf("%p\n", *(pc+i));	
	}

}

#指针的应用 使用指针传递参数

        在使用函数传递数据时,函数内部会生成一个局部变量,这个变量,会将传进来的参数的数据全部进行复制到自己的地址内部,如果这个数据很小,没什么问题,如果数据很多,很大,那么此时,就会影响程序响应进度,当使用指针进行传递数据时,不需要考虑这个,因为指针内部存贮的地址,直接指向的就是需要传递的数据本身,没有复制的这个过程,如果使用指针就会快上很多,具体代码如下所示

void Value_return(char b[]);
void Value_return1(char param[]);
int main()
{
	char c[3] = {0x01,0x02,0x03};
	Value_return(c);
	Value_return1(c);
	return 0;
}
void Value_return(char *pc) {
	int i = 0;
	for (i = 0; i < 3; i++) {
		printf("%p\n", *(pc + i));
	}
}
void Value_return1(char param[]) {
	int i = 0;
	for (i = 0; i < 3; i++) {
		printf("%p\n", param[i]);
	}
}

        当使用Value_return1()这个函数进行返回参数值的时候,会生成局部变量 char param这个局部变量内部会全部复制,char c 里面的内容,如前文所讲,如果进行大批量数据进行传输时,程序执行速度回变慢,当调用Value_return()的时候,使用指针,指针内部存放的是,数组参数的首地址,然后进行++遍历,这个过程是没有进行复制操作的。过程相对于第一个函数是很快的。

标签:int,练习,C语言,char,pc,地址,类型,指针
From: https://blog.csdn.net/weixin_62292999/article/details/139561257

相关文章

  • C语言王国——数组的旋转(轮转数组)三种解法
    一、题目给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。示例1:输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右轮转1步:[7,1,2,3,4,5,6]向右轮转2步:[6,7,1,2,3,4,5]向右轮转3步:[5,6,7,1,2,3,4]示例......
  • 2024年春季学期《算法分析与设计》练习15
    A:简单递归求和题目描述使用递归编写一个程序求如下表达式前n项的计算结果: (n<=100)1- 3+5-7+9-11+......输入n,输出表达式的计算结果。输入多组输入,每组输入一个n,n<=100。输出输出表达式的计算结果。样例输入 Copy12样例输出 Copy1-2#pragma......
  • C语言字符串处理函数strstr的用法
    C语言字符串处理函数strstr的用法在C语言中,strstr函数是一个字符串处理函数,用于在一个字符串(称为“主字符串”)中查找另一个字符串(称为“子字符串”)的首次出现。如果找到子字符串,则该函数返回一个指向主字符串中子字符串首次出现位置的指针;如果没有找到,则返回NULL。函数的原型定......
  • 二级web基础操作题练习(6)——嵌入Javascript代码
    -----要求----- 用JavaScript编写如图1所示页面,当在第一个文本框中输入URLhttp://test.cn/index.jsp?key0=0&key1=1&key2=2,点击按钮“解析参数“后,在下面的三个文本框中分别显示解析出来的参数,如图2所示。图1图2 -----代码示例-----<html><head><!--设置字符编......
  • c语言开发 php扩展 sm4
    首先php可以直接调用openssl直接进行sm4sm3的加密如:openssl_encrypt($plaintext,'sm4-cbc',$key,OPENSSL_RAW_DATA,$iv);openssl_digest('123','sm3')php如果直接调用sm2需要统一使用openssl的evp接口openssl1.1的源码在sm2_crypt文件里面此处只是学习/*gmteste......
  • c语言实现密码学算法应用
    一实验目的   1、掌握对称密钥密码体制的基本概念;   2、掌握对称密钥密码体制DES加密/解密的工作原理;   3、掌握非对称密码算法RSA加密/解密的基本原;   4、通过用DES和RSA算法对实际的数据进行加密/解密运算深刻理解加密算法原理。二实验内容   根据给......
  • 指针和数组-1
    目录1、指针的算术运算指针加上整数:指针减去整数:两个指针相减:2、指针用于数组处理1.访问数组元素:2.遍历数组:3.修改数组元素:​ 4.传递数组到函数:​5.动态内存分配(先了解后面章节会详解):3、指针比较1.检查两个指针是否相等2.检查一个指针是否在另一个之前或之后......
  • c语言目录操作
    在shell中我们可以直接输入命令pwd来显示当前的工作目录,在C程序中调用getcwd函数可以获取当前的工作目录。函数声明:char*getcwd(char*buf,size_tsize);需要头文件:#includegetcwd函数把当前工作目录存入buf中,如果目录名超出了参数size长度,函数返回NULL,如果成功,返回buf......
  • 【接口自动化测试框架练习】springboot+react+mysql~极简版postman
    可以说是一个toyprogram,chatgpt完成了一部分工作,我也完成了一部分工作,我俩合作的,我占百分之80%,他百分之20%,哈哈没他不行,源码奉上。https://github.com/Jinwenxin/test-api-frontend1.功能简介:分成三部分,如左侧导航栏所示:测试用例管理:测试用例的增删改查以及运行测试套件管理......
  • C语言详解(编译和链接)
    Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~~......