C语言--指针进阶1--字符指针、数组指针、指针数组、数组传参和指针传参

本文详细介绍了C语言中的字符指针、const与指针的关系、指针数组和数组指针的定义及使用,特别强调了数组传参和指针传参的差异,帮助读者深入理解C语言中指针的运用。
摘要由CSDN通过智能技术生成


前言

在指针初体验(C语言–指针初体验)中我们简单了解了指针的知识和使用:

  1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
  2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。
  3. 指针是有类型,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。
  4. 指针的运算。

那么从本文开始将记录在深入学习指针过程中的一些课件摘录和学习笔记。


一、字符指针 ( char * )

字符型指针就是指向字符或者字符串的char*型指针,一般的使用如下:

int main()
{
   
    char ch = 'w';//定义一个字符变量
    char *pc = &ch;//将字符变量取地址存入一个字符型指针
    return 0;
}

再比如:

int main()
{
   
    const char* pstr = "hello bit.";//这里是把一个字符串放到pstr指针变量里了吗?
    printf("%s\n", pstr);
    return 0;
}

需要注意的是,这里并不是将整个“hello bit.”字符串存入pstr指针,而只是将字符串的首字母“h”的地址存入指针。这和字符数组常量赋值时是不一样的。

请看下面代码,思考输出结果:

#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;
}

输出结果:
在这里插入图片描述
可以看到,str1和str2这两个字符数组是不同的,但是str3和str4两个字符指针却是相同的。

原因是定义初始化两个字符数组时,虽然内容相同,但却是在内存中开辟出两个不同的空间来存放相同的东西,那这两个空间的地址自然是不同的,str1和str2作为字符数组首字符地址也自然不同;
而str3和str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。因此str3和str4是相同的。

此处需要注意的是,常量字符串是不能被修改的。如下代码其实是错误的:

    char *ch = "world";
    *ch = 'w';//常量字符串不可被修改
    printf("%c\n", *ch);

因此,既然常量字符串无法被修改,那么两个指向相同字符串地址的指针变量也没必要开辟两个空间,共用一个就可以了。

二、const与指针及其他的关系

详见:
https://www.runoob.com/w3cnote/cpp-const-keyword.html

三、 指针数组

指针数组本质上是一个数组,一个用来存放指针的数组。
即数组中存放的全是地址。
如下:

int* arr1[10]; //整形指针的数组
char *arr2[4]; //一级字符指针的数组
char **arr3[5];//二级字符指针的数组

举例:a,b,c三个都是数组名,所以可以存入指针数组中。

//指针数组:
int main()
{
   
	int a[5] = {
    1,2,3,4,5 };
	int b[] = {
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值