目录
多维数组
#include <stdio.h>
int main(int argc,char * argv[])
{
//任何数组实际上在物理内存上都是一维的,之所以我们把它分为一,二,三维数组是在逻辑层面上
//对了数组是一段连续的空间,这个居然一直没有说过!!!
int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
//这个说没说过 忘记了 反正说下准没错
//&arr arr &arr[0][0]地址是一样的,但是表示的不一样
//&arr是整个数组的首地址,步长为整个数组
printf("%u\n", &arr);
printf("%u\n", &arr + 1);
//arr是数组的第一个元素地址,他的第一个元素为一个一维数组,步长为16
printf("%u\n", arr);
printf("%u\n", arr + 1);
//&arr[0][0]是arr[0][0]的地址,步长为4
printf("%u\n", &arr[0][0]);
printf("%u\n", &arr[0][0] + 1);
int* p = &arr[0][0];
//指针遍历
for (int i = 0; i < 12; ++i)
{
printf("%d ", *(p + i));
}
printf("\n");
//遍历
for (int i = 0; i < 12; ++i)
{
printf("%d ", p[i]);
}
printf("\n");
for (int i = 0; i < 12; ++i)
{
//这样不可以 还记得 []是*()的简化版本嘛 这个很重要哦
//arr[i] = *(arr+i)
//arr是数组的首元素地址,在二维数组中他是一个一维数组,步长是这个一维数组
//printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
多级指针
#include <stdio.h>
int main(int argc,char * argv[])
{
//多级指针
int num = 10;
int* p = #
int** pp = &p;
int*** ppp = &pp;
//打印的都是 num的地址 num的值
printf("&num = %p\n", &num);
printf("num = %d\n", num);
printf("p = %p\n", p);
printf("*p = %d\n", *p);
printf("*pp = %p\n", *pp);
printf("**pp = %d\n", **pp);
printf("**ppp = %p\n", **ppp);
printf("***ppp = %d\n", ***ppp);
return 0;
}
指针作为参数
交换两个变量
#include <stdio.h>
void swap1 (int num, int num2);
void swap2(int* num, int* num2);
int main(int argc,char * argv[])
{
//指针作为参数,可以在函数内部修改变量
//改变普通变量需要一级指针,改变指针需要二级指针
int num = 10;
int num2 = 20;
//传值无法交换
//因为传递函数相当于赋值操作,这个之前有说过
swap1(num, num2);
printf("num = %d,num2 = %d\n", num, num2); //10 20
//其实传递地址,也是赋值操作,但是按照地址寻找的空间时同一个空间(内存)
swap2(&num, &num2);
printf("num = %d,num2 = %d\n", num, num2); //20 10
return 0;
}
void swap1(int num, int num2)
{
//这个交换应该不用说吧,内存是两个空间(两杯水)
//相互交换需要第三个空间(第三杯)
int temp = num;
num = num2;
num2 = temp;
}
void swap2(int* num, int* num2)
{
int temp = *num;
*num = *num2;
*num2 = *num;
}
函数内部改变指针
#include <stdio.h>
void changeThePointer(int** pp);
int main(int argc,char * argv[])
{
int* p = NULL;
//传递一级指针的地址
changeThePointer(&p);
printf("*p = %d\n", *p);
return 0;
}
void changeThePointer(int** pp)
{
int num = 10;
*pp = #
}
一维数组作为参数
#include <stdio.h>
//数组作为函数传递时会弱化为指针
void callArray(int arr[5]);
//和上面声明是等价的
//void callArray(int* arr);
int main(int argc,char * argv[])
{
int arr[5] = { 1,2,3,4,5 };
printf("%d\n", sizeof(arr)); //20
callArray(arr);
return 0;
}
void callArray(int arr[5])
{
//传进来的就是一个指针(首地址)所以是四个字节,这个面试中有时候会出现哦
printf("%d\n", sizeof(arr)); //4
}
我要为自己狡辩一下,昨天我真的有写,只是忘记发送了而已.....