一、认识字节
八个二进制位算作一个单位,这个单位就称作字节。
在内存条中,其基本存储单位就是字节,一个字节也称作一个内存单元。
内存条就按照内存单元编号。我们经常说到的内存地址,就是指内存单元的编号。
二、理解指针
指针只不过是内存编号的一个“高大尚”的称呼而已,我们只要记住指针就是内存地址,指针就是内存单元的编号。
通过指针变量,就可转到另一块内存单元,进而操作该内存单元。
1.指针操作整型数组
代码
#include <stdio.h>
void reveal(int *array, int length);
int main(int argc, char *argv[]) {
puts("遍历整型数组");
int integerArray[8] = {51, 20, 14, 13, 59, 10, 19, 93};//整型数组
int lengthOfIntegerArray = sizeof(integerArray) / sizeof(int);
reveal(integerArray, lengthOfIntegerArray); //遍历整型数组
return 0;
}
void reveal(int *array, int length) {
printf("[");
for (int i = 0; i < length; i++) {
if (i == length - 1)
printf("%d]\n", *(array + i));
else
printf("%d,", *(i + array));
}
}
运行展示
2.指针操作字符数组
代码
#include <stdio.h>
void reveal(char *array);
int main(int argc, char *argv[]) {
puts("遍历字符数组");
char characterArray[128] = "I will meet you";//字符数组
reveal(characterArray); //遍历字符数组
return 0;
}
void reveal(char *array)
{
char * temporary=array;
putchar('[');
while(*temporary)//*temporary!='\0'
{
if(*(temporary+1)=='\0')
printf("%c]",*temporary);
else
printf("%c,",*temporary);
temporary++;
}
}
运行展示
思考:现在想象一下,看到该博客的你有了”瞬间转移“的异能。只要你在脑子里想象你要去的地方,之后轻轻地吐口口水,不论多少,只要吐了就行,瞬间就能从一个地方转移到另一个地方。
这里的"瞬间转移"不同于以往的“瞬间转移”。以往的“瞬间转移”,只要想象就能去到自己想去的地方,而这里的“瞬间转移”在想象后还需要吐口水,为什么还要吐口水呢?
再思考:假设我们有个整型指针变量,存储着整型变量的指针。我们无法直接操作整型变量,只能操作整型指针变量。若要操作整形变量,是不是得在整型指针变量前加个星号 * ?那么这个星号和口水的功能是不是相同的?将你所在的空间转移到另一个你想去的空间。
光想象还不行(double * pointer=&salary;),还得吐口水(*pointer)才能去到你想去的地方。
指针是用来干什么的?答:转移空间!
三、指针的简单应用
1、指针在函数中的应用
在向函数传递指针(内存单元编号、内存单元地址)时,传递的是指针变量的值(内存单元的编号)或者某一个基本类型变量的指针(内存单元的编号),函数这边接收到指针变量的值(内存单元的编号)后,即可在函数内部操作函数外部的变量。
示例1:向函数传递指针变量的值
指针变量的值就是指针/地址
源码:
运行:
示例2: 向函数传递一个基本类型变量的指针/地址
源码:
运行:
2、指针操作数组
定义数组:int integer_array[10]时,其实数组名integer_array并不是代表整个数组,而是代表数组首个元素的地址/指针,并且integer_array是个常量,不可改变。知道这一点后,我们就可一改操作数组的常态,运用指针来操作。
示例1:为数组录入并输出数据
源码:
运行:
示例2:另类的指针操作数组
源码:
运行:
示例3:另类的指针操作数组
源码:
运行:
3、指针在函数中操作数组
主要有一个指针版冒泡排序函数,一个指针版遍历数组函数
源码:
运行:
看到这里,再探指针就完结了。相信自己,指针不过如此,,,,,,