自学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