指针概念&&字符指针&&指针数组

举报
芒果_Mango 发表于 2022/02/26 21:43:56 2022/02/26
【摘要】 1.指针的概念1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间2.指针变量的大小固定是4/8个字节(32/64位平台)3.指针是有类型的,指针的类型决定了指针±整数的步长,指针解引用的权限 2.字符指针情形1:char a = 'a'; char* p = &a;情形2:char* p = "Mango";int main(){ char ch = 'w'; char...

1.指针的概念

1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间

2.指针变量的大小固定是4/8个字节(32/64位平台)

3.指针是有类型的,指针的类型决定了指针±整数的步长,指针解引用的权限


2.字符指针

情形1char a = 'a'; char* p = &a;
情形2char* p = "Mango";

int main()
{
    char ch = 'w';
    char* pc = &ch;//pc指向的是一个字符常量
    char* p = "hello";	//hello是一个常量字符串, p保存的是常量字符串首字符的地址
   // *p = 'w';//err,常量字符串存放在常量区,内容不可以被修改
    return 0;
}

image-20220213233929431


由于常量字符串不可以被修改,所以可以使用const修饰更好,这样编译的时候,如果有人修改了,就直接报错

image-20220213233953503


练习题

 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");
     }
     return 0;
 }

打印结构

str1 and str2 are not same
str3 and str4 are same


原因:

str1和str2是不同的数组,在栈区开辟空间。
str3和str4指向的是相同的常量字符串,二者保存的都是常量字符串的首字符地址
    
这里str3和str4指向的是一个同一个常量字符串。
  C/C++会把常量字符串存储到单独的一个内存区域,当几个指针。指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4不同。

3.指针数组-是数组

int arr[10];//整型数组-存放整形的数组
char arr[10];//字符数组-存放字符的数组
char* arr[5]//arr是存放字符指针的数组
int* arr[5];//arr是存放整形指针的数组

int main()
{
    int a = 10;
    int b = 20;
    int c = 30;
    int d = 40;
    int* arr[4] = {&a,&b,&c,&d};	//arr2就是整形指针数组
    for(int i = 0;i<4;i++)
    {
        //printf("%d ",*(arr+i));//err
        //*(arr+i):数组i下标对于的内容,打印的是地址
        printf("%d ", *(*(arr + i)));
    }
}

指针数组存放整形数组数组名

int main()
{
    int arr1[]={1,2,3,4,5};
    int arr2[]={2,3,4,5,6};
    int arr3[]={3,4,5,6,7};
    int* parr[]={arr1,arr2,arr3};
    //数组名是首元素地址,是int*类型
    //所以用int* 的数组保存,相当于二维数组
    int i= 0;
    int j =0;
    for(i = 0;i<3;i++)
    {
        for(j = 0;j<5;j++)
        {
            printf("%d ",parr[i][j]);
        }
        printf("\n");
    }
}

相当于二维数组,

parr[i] : 得到下标为i数组的起始地址,相当于拿到了数组名,

parr[i][j]:得到下标为i的数组中下标为j的元素


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。