指针数组
简介
概念:
指针数组的本质是一个数组,只不过数组里面的每一个元素都是指针;
定义格式:
数组类型 *数组名[成员个数];
eg:
//定义一个数组,数组里面的每一个元素都是 int * 类型
int *arr[5];
指针数组使用
#include <stdio.h>
int main(int argc, const char *argv[])
{
//定义三个变量
int value1 = 10;
int value2 = 20;
int value3 = 30;
//定义一个数组,数组里面存放这三个变量的地址
int *arr[3] = {&value1,&value2,&value3};
//通过指针数组访问到value1,value2,value3里面的值
for(int i = 0;i < 3; i++)
{
printf("*(arr[%d]) = %d\n",i,*arr[i]);
}
//指针配合字符串书写
char *str_arr[5];//指针数组,数组里面每一个元素都是char *类型
str_arr[0] = "hello world";//将readonly端存储的"hello world"的首地址
//给str_arr[0]的位置上
str_arr[1] = "hello python";
str_arr[2] = "hello java";
str_arr[3] = "hello c++";
str_arr[4] = "hello PHP";
//使用for循环遍历字符数组
for(int i = 0; i < 5; i++)
{
printf("arr[%d] = %s\n",i,str_arr[i]);
}
puts("--------------------------------");
//定义数组的时候同时初始化
//str_arr1的一个数组,数组里面的每一个元素都是char * 类型
//str_arr1[0]的值是readonly段的hello字符串 h 的地址
char *str_arr1[5] = {"hello","python","c/c++","php","java"};
//使用for循环遍历字符数组
for(int i = 0; i < 5; i++)
{
printf("arr1[%d] = %s\n",i,str_arr1[i]);
}
//二维数组
char str_arr2[5][10] = {"hello","python","c/c++","php","java"};
//定义一个二维数组str_arr2二维数组在内存的栈中
//str_arr2[0][0] = 'h';
for(int i = 0;i < 5;i++)
{
printf("str_arr2[%d] = %s\n",i,&(str_arr2[i][0]));
}
return 0;
}
结果:
*(arr[1]) = 20
*(arr[2]) = 30
arr[0] = hello world
arr[1] = hello python
arr[2] = hello java
arr[3] = hello c++
arr[4] = hello PHP
--------------------------------
arr1[0] = hello
arr1[1] = python
arr1[2] = c/c++
arr1[3] = php
arr1[4] = java
str_arr2[0] = hello
str_arr2[1] = python
str_arr2[2] = c/c++
str_arr2[3] = php
str_arr2[4] = java
格式化输出 %s
%s 输出的是需要一个地址的,拿出地址里面的值,打印出来,判断是不是\0,
是\0的就停止,不是\0的会继续打印,直到遇见\0为止。
main函数传递参数
简介:
C语言中,main函数是C语言的入口函数;main函数本身也是一个函数,函数就会有参数。
main函数的参数:argc,argv;
argc:指针数组argv里面的元素的个数。
argv:指针数组存放的是命令形参数每一个字符串的首地址
main函数传参:
main函数是支持命令行 进行参数传递的。
格式:
./可行性文件 参数1 参数2 参数3 ...
命令行 传递参数 原理
课堂代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
//argc和argv就是c语言的main函数的参数。
//打印参数 argc;
printf("argc = %d\n",argc);
//argv类型:指针数组,数组里面存放的每一个元素都是char * 类型
for(int i = 0; i < argc ; i++)
{
printf("argv[%d] = %s\n",i,argv[i]);
}
return 0;
}
使用命令行传递参数:./a.out 123 138; 将其转化为数字类型;(使用atoi函数)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char *argv[])
{
//获取到指针数组里面每个元素的值
for(int i = 1; i < argc; i++)
{
printf("argv[%d] = %d\n",i,atoi(argv[i]));
}
return 0;
}
数组指针
简介
概念:
数组指针本质上是一个指针,这个指针指向的是一个数组;
数组指针定义个数:
数据类型 (*变量名)[成员个数];
eg:
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int (*p)[10] = &arr;//arr在 &运算符的时候表达的是整个数组
课堂代码
#include <stdio.h>
int main(int argc, const char *argv[])
{
//定义一个数组
int arr[5] = {1,2,3,4,5};
//定义一个指针,保存整个数组的地址
int (*p)[5] = &arr;
//问:指针p的类型是什么?
printf("p = %p, p+1 = %p\n",p,p+1);//移动了整个数组的大小
//指针p的类型是 int[5]数组类型的指针
//p是整个数组的地址;通过p指针变量数组
//*(整个数组的地址) == 变量名 数组名 -> (*p)[0]
for(int i = 0; i < 5; i++)
{
printf("arr[%d] = %d\n",i,(*p)[i]);
}
return 0;
}
结果:
p = 0x7ffd05b42990, p+1 = 0x7ffd05b429a4
arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4
arr[4] = 5
数组指针与二维数组
二维数组:
二维数组本质上也是一个一维数组;这个一维数组里面每个元素都是一个一维数组;
eg:
int arr[2][5];
#include <stdio.h>
int main(int argc, const char *argv[])
{
int arr[2][5] = {{1,2,3,4,5},
{6,7,8,9,10}};
//数组名是数组的首元素的地址;二维数组的首元素,是一个一维数组
//arr 这个二维数组的数组名就是 一维数组{1,2,3,4,5}的地址;
int (*p)[5] = arr;//定义一个指针,指针去指向二维数组的首元素
//在二维数组 p+1移动一行,所以数组指针又称之为 行指针
printf("p = %p; p+1 = %p\n",p,p+1);
printf("&arr[0][0] = %p; &arr[1][0] = %p\n",&arr[0][0],&arr[1][0]);
//通过数组指针遍历二维数组
for(int i = 0;i < 2;i++)
{
for(int j = 0; j < 5; j++)
{
//printf("%d ",(*(p + i))[j]);
//printf("%d ",*(p[i]+j));
//printf("%d ",*(*(p+i)+j));
printf("%d ",p[i][j]);
}
putchar(10);
}
return 0;
}
结果:
p = 0x7ffdde86d350; p+1 = 0x7ffdde86d364
&arr[0][0] = 0x7ffdde86d350; &arr[1][0] = 0x7ffdde86d364
1 2 3 4 5
6 7 8 9 10
课堂练习
要求:定义一个数组:函数的功能 遍历一个二维数组
//完成这个show函数
void show(int (*p)[3],int line,int col)
{
for(int i = 0; i < line; i++)
{
for(int j = 0; j < col; j++)
{
printf("%d ",(*(p + i))[j]);
}
}
}
int main()
{
int arr[2][3] = {{1,2,3},{4,5,6}};
show(arr,2,3);
}
数组名 +或- 移动字节数
简介
*:标识的是降维;
&:标识的是升维;
数组元素的首元素地址:
*数组的首元素地址 = 数组首元素的值;
&数组的首元素地址 = 整个数组的地址;
一维数组
二维数组
二级指针
简介
概念:
一级指针也是一个变量,定义在内存中,一级指针就会有一个地址。
保存一级指针的地址的指针,就称之为二级指针;
定义个数:
<数据类型> **指针名 = value;
课堂代码
#include <stdio.h>
int main(int argc, const char *argv[])
{
//定义一个变量
int number = 10;
//定义一个一级指针
int *p = &number;
//定义一个指针,用来存放指针p的地址
int **q = &p;
return 0;
}