指针详解(C语言进阶)

时间:2023-01-07 16:56:57
  • 字符指针
  • 指针数组

自学b站“鹏哥C语言”笔记。本章笔记不全。

回顾:在文章【初识指针】中,我们已经了解到的指针概念有

  • 指针是一种变量,用来存放地址,地址唯一标识一块内存空间。
  • 指针的大小是固定的,在32平台中是4字节,在64平台中是8字节。
  • 指针的不同类型决定了指针+-整数的步长,决定了解引用操作能访问的空间大小。
  • 指针的运算。

一、字符指针

字符指针char*

一般使用方法

int main()
{
char ch = 'w';
char* pc = &ch;
*pc = 'w';
return 0;
}

另一种使用方法

int main()
{
char* p = "abcdef";
printf("%c\n", *p);
printf("%s\n", p);
return 0;
}

输出结果:a abcdef

解析

​char* p = "abcdef";​

并不是把abcdef赋值给p,而是把首字符a的地址赋值给p

​printf("%c\n", *p);​​中%c是打印一个字符,解引用p的地址后打印出a

​printf("%s\n", p);​​中%s是打印一个字符串,指针的这种用法是正确的

例1:

#include <stdio.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcdef";
if(arr1 == arr2)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}

输出结果:haha

解析

数组名是数组的首元素地址,arr1和arr2自然是不相等的。

变式:

#include <stdio.h>
int main()
{
char* p1 = "abcdef";
char* p2 = "abcdef";
if(p1 == arr2)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}

输出结果:hehe

解析

“abcdef”是常量字符串,是无法更改的,内存默认只存储一份

而第4、5行代码中p1、p2的值是“abcdef”的首元素地址,是相同的。

二、指针数组

指针数组是存放指针的数组

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

运用:

#include <stdio.h>
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 i = 0;
for(i=0; i<3; i++)
{
int j = 0;
for(j=0; j<5; j++)
{
printf("%d ", *(parr[i]+j));
}
printf("\n")
}
return 0;
}

输出结果:

1 2 3 4 5

2 3 4 5 6

3 4 5 6 7