坚持就是胜利
文章目录
- 一、指针和数组
- 二、二级指针
- 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) 相当于 aprintf("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号字
红色
绿色
蓝色