指针进阶
我们在初阶时就已经接触过指针,了解了指针的相关内容,有:
- 指针定义:指针变量,用于存放地址。地址唯一对应一块内存空间。
- 指针大小:固定32位平台下占4个字节,64位8个字节。
- 指针类型:类型决定指针±整数的步长及指针解引用时访问的大小。
- 指针运算:指针解引用,指针±整数,指针-指针,指针关系运算。
本章节在此基础上,对C语言阶段指针进行更深层次的研究。
字符指针
字符指针,存入字符的地址,类型为char*
字符指针的作用
char ch = 'w';
char* pc = &ch;
*pc = 'a';
这里指针pc就是ch的地址,指向字符ch。 字符地址的类型是字符指针类型(char*)。
char* pstr = "hello world";
printf("%s\n", pstr);
printf("%s\n", pstr+1);
printf("%c\n", *(pstr+1));
pstr就是字符串首字符的地址,指向字符’h’。 pstr+1指向第二个字符’e’,以此类推。 打印字符串,遇到’\0’停止打印。 "hello world"是常量字符串,无法修改,其实应该加const,但是舍弃const这个字符串还是不可以修改。
有如下例题
#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实际上是地址的比较 str1和str2是普通的数组,是在内存上开辟了两块空间不过存放了一样的数据。 str3和str4指向常量字符串,存放在内存的常量区,是不可被修改且具有唯一性即常量区只存放一个。所以str3和str4指向的都是同一个字符串。 所以str1 != str2,str3 == str4。
总结
- 常量字符串不可被修改,存放在内存的常量区。
- 具有唯一性即常量区只存放一个。
指针数组
指针数组的定义
指针数组是一个存放指针的数组
int* arr1[10];整型指针数组
char* arr2[4];字符指针数组
char** arr3[5];二级字符指针数组
指针数组的使用
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
int c =30;
int d = 40;
int* arr[4] = {&a, &b, &c, &d};
for (int i=0; i<4; i++)
{
printf("%d ", *arr[i]);
}
return 0;
}
int main()
{
int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = {2, 3, 4, 5, 6};
int arr3[] = {3, 4, 5, 6, 7};
int* p[] = {arr1, arr2, arr3};
int i = 0;
for (i=0; i<3; i++)
{
int j = 0;
for (j=0; j<5; j++)
{
printf("%d ", p[i][j]);
}
printf("\n");
}
return 0;
}
int main()
{
const char* p[] = {"abcd", "bcde", "cdef", "defg"};
int i = 0;
for (i=0; i<4; i++)
{
int j = 0;
for (j=0; j<4; j++)
{
printf("%c", *(*(p+i)+j));
}
printf("\n");
}
return 0;
}
总结 - 很重要
p[i] == *(p+i)
p[i][j] == *(*(p+i)+j) == *(p+i)[j] == *(p[i]+j)
|