坚持就是胜利
文章目录
- 一、指针和数组
- 二、二级指针
- 1、什么是 二级指针?
- 2、二级指针 解引用
- 三、指针数组
- 模拟二维数组
一、指针和数组
问(1):指针和数组之间是什么关系呢?
答:指针变量就是指针变量,不是数组,指针变量的大小是4/8个字节,专门是用来存放地址的。
数组就是数组,不是指针,数组是一块连续的空间,可以存放1个或者多个类型相同的数据。
问(2):指针和数组之间是什么联系呢?
答:数组中,数组名其实是数组首元素的地址,数组名 == 地址 == 指针。
当我们知道数组首元素的地址的时候,因为数组又是连续存放的,所以通过指针就可以遍历访问数组。
数组是可以通过指针来访问的。
#include <stdio.h>
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
printf("%p\n", &arr[i]);
}
return 0;
}
#include <stdio.h>
int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
int* p = arr;
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
printf("%d\n", arr[2]);
printf("%d\n", p[2]);
printf("%d\n", *(arr + 2));
printf("%d\n", *(2 + arr));
printf("%d\n", *(p + 2));
printf("%d\n", *(2 + p));
return 0;
}
二、二级指针
1、什么是 二级指针?
问:指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里呢?
答:这就是 二级指针。
#include <stdio.h>
int main()
{
int a = 10;
int* p = &a; //p 是一级指针变量,指针变量也是变量,变量是在内存中开辟空间的,是变量就有地址。
int** pp = &p; //pp 就是 二级指针,二级指针变量 就是用来存放 一级指针变量的地址
int*** ppp = &pp; //一样的分析方法
return 0;
}
2、二级指针 解引用
*pp 相当于 p , *(*pp) 相当于 a
#include <stdio.h>
int main()
{
int a = 10;
int* p = &a;
int** pp = &p;
*(*pp) = 20; // *pp 相当于 p , *(*pp) 相当于 a
printf("a = %d\n", a);
return 0;
}
#include <stdio.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "hello world";
char arr3[] = "sunchao";
char* parr[] = { arr1,arr2,arr3 };
char** p = parr;
return 0;
}
三、指针数组
问:指针数组是 指针 还是 数组 ?
答:是 数组。是存放指针的数组。
整型数组:存放整型的数组
字符数组:存放字符的数组
指针数组:存放指针(地址)的数组
#include <stdio.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "hello world";
char arr3[] = "sunchao";
char* parr[] = { arr1,arr2,arr3 };
int i = 0;
for (i = 0; i < 3; i++)
{
printf("%s\n", parr[i]);
}
return 0;
}
模拟二维数组
和数组有本质的区别:请看图(数组是连续的存储空间,然而指针是在内存中开辟不同的存储空间)
#include <stdio.h>
int main()
{
int arr1[] = { 0,1,2,3,4 };
int arr2[] = { 1,2,3,4,5 };
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]);
}
putchar('\n');
}
return 0;
}
微软雅黑字体
黑体
3号字
4号字
红色
绿色
蓝色