C语言:指针的详细讲解1

本文详细讲解了C语言中的指针概念,包括字符指针的使用,如修改指向元素的内容、输出字符串,以及常量字符串的区别。还探讨了指针数组和数组指针的差异,包括它们在内存中的表示和遍历方法。
摘要由CSDN通过智能技术生成

复习一下指针的概念

  1. 指针就是一个变量,用来存放地址,地址标识一块空间
    内存会划分为小的内存单元,每个内存单元都有一个编号,这个编号就被称为地址,我们通常把存 有地址的“容器”称为指针
    内存编号=地址=指针
    指针或地址,要存储,就可以存放到指针变量中去
  2. 指针的大小是4/8个字节,当为32位系统时是4字节,64位系统为8字节
  3. 指针是有类型的,指针决定了指针±的步长,也就是说指针的类型决定了指针一次可以跳多少个字节
  4. 指针的运算
    指针±整数:根据指针类型,移动指针
    指针-指针:返回元素个数,整形指针-整形指针返回其中有多少个整形
    指针的关系运算

1.字符指针

1.1修改字符指针指向元素的内容

我们先来看一下下面这个代码

int main()
{
   
	char ch = 'w'; //创建一个char类型的变量去存放字符'w'
	char *pc = &ch;//创建一个字符指针变量,去存放                                                                                                                                                                   
	*pc = 'a';//将字符'a'存放到pc地址所指向的字符,也就是把pc所指向的字符更改成字符'a'
	return 0;
}

在这里插入图片描述
这个代码的意思是我们通过指针找到了此地址存放的变量,只需通过解引拿到地址存放的变量后进行赋值操作我们就可以更改此地址处存放的数值



1.2 指针指向字符串首元素

我们再来看一下指针存储字符串这种情况

int main()
{
   
	char *p="abcdef";//将字符串首元素a的地址存放在指针变量p中
}	

在这里插入图片描述
字符串的首元素是字符’a’,这里我们假设字符’a’的地址为0x001155f2,指针变量p指向字符串的时候,其实指向的是字符首元素的地址,也就是字符’a’的地址,这就不难理解指针变量p中存放的是0x001155f2
在这里插入图片描述
我们把指针p解引用看一下,你会发现输出的就是字符’a’,也就能看出来p这个指针变量中存放的就是字符串首元素地址



1.3使用字符指针去输出字符串

注意:
在这里插入图片描述
而打印字符串时,我们不需要解引用地址,给出首元素地址,%s可以顺着首元素去打印整个字符串



1.4更改常量字符串会发生什么

假如我们要更改这个字符串

在这里插入图片描述
你会发现运行结果是错误的,因为字符串"abcdef"是一个常量字符串,一旦更改会发生错误,计算机不允许去更改常量字符串,常量字符串会存放在只能进行‘读’操作的常量区,所以无法更改



1.5常量字符串和字符数组在内存中有什么不同

我们来看一下下面这个面试题

#include <stdio.h>
int main()
{
   
    char str1[] = "hello bit.";
    char str2[] = "hello bit.";
    const char *str3 = "hello bit.";
    const char *str4 = "hello bit.";
    if(str1 ==str2)
	printf("str1 and str2 are same\n");
    else
 	printf("str1 and str2 are not same\n");     
    if(str3 ==str4)
 	printf("str3 and str4 are same\n");
    else
 	printf("str3 and str4 are not same\n");   
    return 0; 
}

这里的答案是:
在这里插入图片描述
你可能会觉得很诧异,str3和str4竟然是同一个字符串,确实是这样的
当你创建了两个相同的常量字符串时,因为是相同的常量字符串,编译器只会在常量区创建一个字符串,所以当你查询他们地址时,会发现他们是同一个地址
在这里插入图片描述
由于str1和str2是放在栈区,所创建的是两个不同的数组,所以 取出的地址也不相同





2.指针数组

2.1指针数组是什么

我们用类比来看一下什么是指针数组

整形数组:存放整形的数组
int arr[10]

字符数组:存放字符的数组
char arr[10]


所以我们可以推出指针数组就是:存放指针的数组,也就是说数组的每个元素都是指针
在这里插入图片描述
在这里插入图片描述

这里之所以是int*arr[3]其中3是数组中存放的元素个数,也就是说,指针数组中存放了3个指针

遍历方法:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值