C语言例题讲解指针与数组

目录
  • 1.概要复习
  • 2.指针与数组笔试题
    • 2.1一维数组
    • 2.2字符数组
    • 2.3字符串数组
    • 2.4字符串指针
    • 2.5二维数组

1.概要复习

本篇的内容主要围绕指针与数组、指针与字符串等之间的关系,以及进一步理解sizeof 、strlen 的使用与意义。

数组是指具有相同类型元素的集合,字符串常量是一个指向在连续空间里存放的字符的首字符的地址的指针。我们会在下面理解数组与字符串数组的不同。

sizeof 是一个操作符,是计算类型空间大小的。strlen 是针对字符串的库函数,用来求字符串的长度。

对于数组来说,数组名都是首元素地址,除了这两种情况外:

  • sizeof(数组名)——sizeof内部单独放置数组名表整个数组
  • &数组名——对数组名进行取地址操作表取出整个数组的地址

2.指针与数组笔试题

我们的目的是求下面各个 printf 语句输出什么。

2.1一维数组

#include <stdio.h>
int main()
{
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(a + 0));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a + 1));
	printf("%d\n", sizeof(a[1]));
	printf("%d\n", sizeof(&a));
	printf("%d\n", sizeof(*&a));
	printf("%d\n", sizeof(&a + 1));
	printf("%d\n", sizeof(&a[0]));
	printf("%d\n", sizeof(&a[0] + 1));
	return 0;
}
#include <stdio.h>
int main()
{
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));
	//sizeof 内部单独放置数组名,计算整个数组的大小,结果为 4(int类型)*4(元素个数)=16
	printf("%d\n", sizeof(a + 0));
	//sizeof 内部没有单独放置数组名,此时数组名表首元素地址,a+0 依然表示首元素地址
	//故 sizeof 计算一个地址(指针)的大小为 4 or 8
	printf("%d\n", sizeof(*a));
	//sizeof 内部没有单独放置数组名,此时数组名表首元素地址,*a 表对该地址解引用
	//即可得到 a 数组的第一个元素,大小为 4(int类型)
	printf("%d\n", sizeof(a + 1));
	//sizeof 内部没有单独放置数组名,此时数组名表首元素地址,a+1 表第二个元素地址
	//故 sizeof 计算一个地址(指针)的大小为 4 or 8
	printf("%d\n", sizeof(a[1]));
	//sizeof 内部没有单独放置数组名,a[1] 表数组的第二个元素,此写法可转置为 *(a+1)
	//即计算的结果是第二个元素的类型大小,即 4(int类型)
	printf("%d\n", sizeof(&a));
	//sizeof 内部没有单独放置数组名,而是放置了 &a ,表取出整个数组的地址
	//故 sizeof 计算一个地址(指针)的大小为 4 or 8
	printf("%d\n", sizeof(*&a));
	//sizeof 内部虽然看似没有单独放置数组名,但是通过 &a 取出整个数组地址
	//然后通过 * 找到整个地址,与 sizeof(a) 没有差别
	//故这里的 sizeof 计算的也是整个数组的大小,即 4(int类型)*4(元素个数)=16
	printf("%d\n", sizeof(&a + 1));
	//sizeof 内部没有单独放置数组名,&a+1 表取出整个数组的地址,并向后跳跃一个数组类型的大小
	//即此时的地址是指向元素 4 的后面一块 int 类型的内存空间
	//故 sizeof 计算地址(指针)的大小为 4 or 8
	printf("%d\n", sizeof(&a[0]));
	//sizeof 内部没有单独放置数组名,&a[0] 表取出数组第一个元素的地址
	//故 sizeof 计算地址(指针)的大小为 4 or 8
	printf("%d\n", sizeof(&a[0] + 1));
	//sizeof 内部没有单独放置数组名,&a[0]+1 表取出数组第一个元素地址并向后跳跃一个 int 类型的大小
	//故 sizeof 计算的是地址(指针)的大小为 4 or 8
	return 0;
}

2.2字符数组

#include <stdio.h>
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr + 0));
	printf("%d\n", sizeof(*arr));
	printf("%d\n", sizeof(arr[1]));
	printf("%d\n", sizeof(&arr));
	printf("%d\n", sizeof(&arr + 1));
	printf("%d\n", sizeof(&arr[0] + 1));
	printf("%d\n", strlen(arr));
	printf("%d\n", strlen(arr + 0));
	printf("%d\n", strlen(*arr));
	printf("%d\n", strlen(arr[1]));
	printf("%d\n", strlen(&arr));
	printf("%d\n", strlen(&arr + 1));
	printf("%d\n", strlen(&arr[0] + 1));
	return 0;
}
#include <stdio.h>
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };//非字符串!!!!!!
	printf("%d\n", sizeof(arr));
	//sizeof 内部单独放置数组名,故计算的是整个数组的大小
	//即大小为 1(char类型)*6(元素个数)=6
	printf("%d\n", sizeof(arr + 0));
	//sizeof 内部没有单独放置数组名,arr 表数组首元素地址,arr+0 亦表示首元素地址
	//故 sizeof 计算地址(指针)的大小为 4 or 8
	printf("%d\n", sizeof(*arr));
	//sizeof 内部没有单独放置数组名,arr 表数组首元素地址,*arr 表对该地址解引用
	//便得到数组第一个元素 'a' ,故大小为 1(char类型)
	printf("%d\n", sizeof(arr[1]));
	//sizeof 内部没有单独放置数组名,arr[1] 表数组第二个元素,即 'b'
	//故大小为 1(char类型)
	printf("%d\n", sizeof(&arr));
	//sizeof 内部没有单独放置数组名,&arr 表取出整个数组的地址
	//故 sizeof 计算的地址(指针)的大小为 4 or 8
	printf("%d\n", sizeof(&arr + 1));
	//sizeof 内部没有单独放置数组名,&arr+1 表取出整个数组的地址并向后跳跃一个数组类型的大小
	//即指向元素 'f' 后一个 char 类型的空间
	//故 sizeof 计算的是地址(指针)的大小为 4 or 8
	printf("%d\n", sizeof(&arr[0] + 1));
	//sizeof 内部没有单独放置数组名,&arr[0]+1 表取出数组一个元素的地址并向后跳跃一个 char 类型的大小
	//故 sizeof 计算的地址(指针)的大小为 4 or 8
	printf("%d\n", strlen(arr));
	//strlen 不是 sizeof ,故 arr 表数组首元素地址,strlen 会以此地址开始向后寻找 '\0'
	//但此数组并不包含 '\0' ,故 strlen 的返回值为随机值
	printf("%d\n", strlen(arr + 0));
	//strlen 不是 sizeof ,arr+0 表首元素地址,strlen 的返回值也是一个随机值
	printf("%d\n", strlen(*arr));
	//strlen 不是 sizeof ,*arr 表对数组首元素地址解引用,得到字符 'a' ,其 ASCLL 码值为 97
	//strlen 会以 97 为起始地址向后寻找 '\0'
	//但个人理解认为:97 是一个没有初始化的指针(地址),即野指针
	//故这里会报错
	printf("%d\n", strlen(arr[1]));
	//arr[1] 表数组的第二个元素 'b' ,其 ASCLL 码值为 98
	//strlen 会以 98 为起始地址向后寻找 '\0'
	//但个人理解认位:98 是一个没有初始化的指针(地址),即野指针
	//故这里依然会报错
	printf("%d\n", strlen(&arr));
	//&arr 表取出整个数组的地址,strlen 会以此作为起始地址向后寻找 '\0'
	//这里需要注意,在 strlen 的函数声明当中,参数是一个 char* 类型的指针
	//也就是我们虽然传参时传了一个数组指针,但是 strlen 接收时会自动强转为 char* 类型指针
	//故数组并不包含 '\0' ,strlen 的返回值是一个随机值
	printf("%d\n", strlen(&arr + 1));
	//&arr+1 表取出整个数组的地址并向后跳跃一个数组类型的大小
	//即指向了元素 'f' 的后一块 char 类型的空间
	//strlen 会以此地址作为起始地址向后寻找 '\0'
	//但因我们无法确定 '\0' 的位置,所以 strlen 的返回值是一个随机值
	printf("%d\n", strlen(&arr[0] + 1));
	//&arr[0]+1 表取出数组首元素地址并向后跳跃一个 char 类型的大小
	//即指向了元素 'b' ,strlen 会以此地址作为起始地址向后寻找 '\0'
	//但数组中并不包含 '\0' ,故 strlen 的返回值是一个随机值
	return 0;
}

我们把报错的两条语句注释掉:

2.3字符串数组

#include <stdio.h>
int main()
{
	char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr + 0));
	printf("%d\n", sizeof(*arr));
	printf("%d\n", sizeof(arr[1]));
	printf("%d\n", sizeof(&arr));
	printf("%d\n", sizeof(&arr + 1));
	printf("%d\n", sizeof(&arr[0] + 1));
	printf("%d\n", strlen(arr));
	printf("%d\n", strlen(arr + 0));
	printf("%d\n", strlen(*arr));
	printf("%d\n", strlen(arr[1]));
	printf("%d\n", strlen(&arr));
	printf("%d\n", strlen(&arr + 1));
	printf("%d\n", strlen(&arr[0] + 1));
	return 0;
}
#include <stdio.h>
int main()
{
	char arr[] = "abcdef";//注意数组里面放的是字符串!!!
	printf("%d\n", sizeof(arr));
	//sizeof 内部单独放置数组名,即计算整个数组的大小
	//大小为 1(char类型)*7(元素个数)=7
	printf("%d\n", sizeof(arr + 0));
	//sizeof 内部没有单独放置数组名,arr+0 表数组首元素地址
	//故 sizeof 计算地址(指针)的大小为 4 or 8
	printf("%d\n", sizeof(*arr));
	//sizeof 内部没有单独放置数组名,*arr 表对数组首元素地址解引用
	//即得到字符 'b' ,故大小为 1(char类型)
	printf("%d\n", sizeof(arr[1]));
	//sizeof 内部没有单独放置数组名,arr[1] 表数组第二个元素即字符 'b'
	//故大小为 1(char类型)
	printf("%d\n", sizeof(&arr));
	//sizeof 内部没有单独放置数组名,&arr 表对整个数组取地址
	//故 sizeof 计算的地址(指针)大小为 4 or 8
	printf("%d\n", sizeof(&arr + 1));
	//sizeof 内部没有单独放置数组名,&arr+1 表取出整个数组地址并向后跳跃一个数组类型大小
	//即指向元素 '\0' 后面一块数组类型大小的空间
	//故 sizeof 计算的地址(指针)大小为 4 or 8
	printf("%d\n", sizeof(&arr[0] + 1));
	//sizeof 内部没有单独放置数组名,&arr[0]+1 表取出数组首元素地址并向后跳跃一个 char 类型大小
	//即指向数组第二个元素
	//故 sizeof 计算的地址(指针)大小为 4 or 8
	printf("%d\n", strlen(arr));
	//strlen 不是 sizeof ,arr 表数组首元素地址,strlen 会以此为起始地址向后寻找 '\0'
	//因为此数组包含 '\0' ,故 strlen 的返回值为 6
	printf("%d\n", strlen(arr + 0));
	//arr+0 表数组首元素地址,strlen 会以此地址为起始地址向后寻找 '\0'
	//因为此数组包含 '\0' ,故 strlen 的返回值为 6
	printf("%d\n", strlen(*arr));
	//*arr 表对数组首元素地址解引用,得到字符 'a' ,其 ASCLL 码值为 97
	//故 strlen 会以此地址为起始地址向后寻找 '\0'
	//但个人理解认位: 97 是一个没有初始化的指针(地址),即野指针
	//故这里会报错
	printf("%d\n", strlen(arr[1]));
	//arr[1] 表数组第二个元素,即字符 'b' ,其 ASCLL 码值为 98
	//strlen 会以此地址会起始地址向后寻找 '\0'
	//但个人理解认位:98 是一个没有初始化的指针(地址),即野指针
	//故这里会报错
	printf("%d\n", strlen(&arr));
	//&arr 表取出整个数组的地址,但观察 strlen 函数的声明可以发现
	//strlen 的函数参数是一个 char* 类型的指针
	//即我们传参传进去的是一个数组指针,当 strlen 接收的时候,会将其强转为字符指针
	//故 strlen 会以数组首元素地址为起始地址,向后寻找 '\0'
	//因为数组包含 '\0' ,故 strlen 的返回值为 6
	printf("%d\n", strlen(&arr + 1));
	//&arr+1 表取出整个数组的地址并向后跳跃一个数组类型大小
	//即指向 '\0' 后一块数组类型的空间
	//strlen 会以此地址为起始地址向后寻找 '\0'
	//但我们无法确定 '\0' 的具体位置,所以 strlen 会返回一个随机值
	printf("%d\n", strlen(&arr[0] + 1));
	//&arr[0]+1 表取出数组首元素地址并向后跳跃一个 char 类型的大小
	//即指向了数组第二个元素的地址
	//strlen 会以此地址作为起始地址向后寻找 '\0'
	//故 strlen 的返回值为 5
	return 0;
}

我们把报错的语句注释掉:

2.4字符串指针

#include <stdio.h>
int main()
{
	char* p = "abcdef";//p 变量存放的是字符串常量的首元素地址
	printf("%d\n", sizeof(p));
	//sizeof 计算地址(指针)的大小为 4 or 8
	printf("%d\n", sizeof(p + 1));
	//p+1 表字符串常量的第二个元素的地址
	//故 sizeof 计算的地址(指针)的大小为 4 or 8
	printf("%d\n", sizeof(*p));
	//*p 表对字符串常量首元素地址解引用。得到字符 'a'
	//故计算的大小为 1(char类型)
	printf("%d\n", sizeof(p[0]));
	//p[0] 可改写成 *(p+0) ,表对字符串常量首元素地址解引用,得到字符 'a'
	//即计算的大小为 1(char类型)
	printf("%d\n", sizeof(&p));
	//&p 表对 char* 类型指针取地址
	//故 sizeof 计算的地址(指针)的大小为 4 or 8
	printf("%d\n", sizeof(&p + 1));
	//&p+1 表对 char* 类型指针变量 p 取地址并向后跳跃一个 char 类型的大小
	//指向的空间是未知的
	//但 sizeof 计算的地址(指针)的大小为 4 or 8
	printf("%d\n", sizeof(&p[0] + 1));
	//&p[0]+1 可改写成 &(*(p+0))+1 ,表取出字符串常量的首元素地址并向后跳跃一个 char 类型的大小
	//即指向了字符 'b'
	//故 sizeof 计算的地址(指针)的大小为 4 or 8
	printf("%d\n", strlen(p));
	//strlen 不是 sizeof ,p表字符串首元素地址
	//strlen 以此地址为起始地址,向后寻找 '\0'
	//故 strlen 的返回值为 6
	printf("%d\n", strlen(p + 1));
	//p+1 表字符串常量的第二个元素的地址,strlen 会以此为地址向后寻找 '\0'
	//故 strlen 的返回值为 5
	printf("%d\n", strlen(*p));
	//*p 表字符串常量首元素,即字符 'a',strlen 会以此为地址向后寻找 '\0'
	//但个人理解人为:'a' 的 ASCLL 码值为 97 ,但 97 是一个没有被初始化的指针(地址),即野指针
	//故这里会报错
	printf("%d\n", strlen(p[0]));
	//p[0] 可改写成 *(p+0) ,表字符串常量首元素,即字符 'a',其 ASCLL 码值为 97
	//strlen 会以此地址为起始地址向后寻找 '\0'
	//但个人理解认位:97 是一个没有被初始化的指针(地址),即野指针
	//故这里会报错
	printf("%d\n", strlen(&p));
	//&p 表取出 char* 类型指针变量的地址,strlen 以此地址为起始地址向后寻找 '\0'
	//但我们无法确定 '\0' 的位置
	//故 strlen 会返回一个随机值
	printf("%d\n", strlen(&p + 1));
	//&p+1 表取出 char* 类型指针变量的地址并向后跳跃一个 char 类型的大小,strlen 以此地址为起始地址向后寻找 '\0'
	//但我们无法确定 '\0'的位置,故 strlen 的返回值会返回一个随机值
	printf("%d\n", strlen(&p[0] + 1));
	//*p{0}+1 可改写为 &(*(p+0))+1 ,表取出字符串常量首元素地址并向后跳跃一个 char 类型的大小
	//即指向了字符串常量的第二个元素的地址,strlen 会以此地址为起始地址向后寻找 '\0'
	//故 strlen 的返回值为 5
	return 0;
}

我们对报错的两条语句注释:

2.5二维数组

#include <stdio.h>
int main()
{
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));
	//sizeof 内部放置的是数组名,故计算整个数组的大小
	//即大小为 4(int类型)*12(元素个数)=48
	printf("%d\n", sizeof(a[0][0]));
	//sizeof 内部没有单独放置数组名,a[0][p] 表数组首元素
	//故 sizeof 的计算值为 4(int类型)
	printf("%d\n", sizeof(a[0]));
	//sizeof 内部放置的看似不是单独的数组名,但 a[0] 表数组的第一个元素
	//此元素也是一个数组
	//故 sizeof 计算的大小为 4(int类型)*4(元素个数)=16
	printf("%d\n", sizeof(a[0] + 1));
	//sizeof 内部放置的不是单独的数组名,a[0] 表二维数组的第一个元素,即拿到了一个数组
	//a[0]+1 表二维数组的第一个数组元素的地址并向后跳跃一个 int 类型的大小
	//故 sizeof 计算的地址(指针)的大小为 4 or 8
	printf("%d\n", sizeof(*(a[0] + 1)));
	//*(a[0]+1) 表对二维数组的第一个数组元素的地址并向后跳跃一个 int 类型的大小的解引用
	//即找到了二维数组中的某一个元素
	//故 sizeof 计算的大小为 4(int类型)
	printf("%d\n", sizeof(a + 1));
	//sizeof 内部没有单独放置数组名,a+1 表二维数组的首元素地址并向后跳跃一个一维数组类型的大小
	//即指向了二维数组的第二个数组元素的地址
	//故 sizeof 计算的地址(指针)的大小为 4 or 8
	printf("%d\n", sizeof(*(a + 1)));
	//*(a+1) 表对二维数组的首元素地址并向后跳跃一个一维数组类型的大小的解引用
	//即得到了二维数组的第二个元素
	//此元素为一个一维数组,故 sizeof 计算的大小为 4(int类型)*4(元素个数)=16
	printf("%d\n", sizeof(&a[0] + 1));
	//&a[0]+1 表二维数组的首元素取地址并向后跳跃一个一维数组的类型大小
	//指向了二维数组的第二个元素
	//故 sizeof 计算的地址(指针)的大小为 4 or 8
	printf("%d\n", sizeof(*(&a[0] + 1)));
	//*(&a[0]+1) 表对二维数组的首元素取地址并向后跳跃一个一维数组的类型大小的解引用
	//即得到了二维数组的第二个元素
	//此元素是一个一维数组,故 sizeof 计算的大小的 4(int类型)*4(元素个数)=16
	printf("%d\n", sizeof(*a));
	//sizeof 内部没有单独放置数组名,*a 表对二维数组首元素地址解引用
	//得到一个一维数组
	//故 sizeof 计算的大小为 4(int类型)*4(元素个数)=16
	printf("%d\n", sizeof(a[3]));
	//a[3] 表二维数组的第三个元素
	//需要说明的是,sizeof 只对类型感兴趣
	//也就是说,二维数组虽然不存在第三个元素,但它的类型依旧是二维数组
	//故 sizeof 计算的是 4(int类型)*4(元素个数)=16
	return 0;
}

到此这篇关于C语言例题讲解指针与数组的文章就介绍到这了,更多相关C语言指针与数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言深入分析数组指针和指针数组的应用

    目录 一.数组类型 二.定义数据类型 三.数组指针 四.指针数组 五.小结 一.数组类型 C语言中的数组有自己特定的类型 数组的类型由元素类型和数组大小共同决定 例:int array[5] 的类型为 int[5] 二.定义数据类型 C语言中通过 typedef 为数组类型重命名:typedef type(name)[size]; 数组类型: typedef int(AINT5)[5]; typedef float(AFLOAT10)[10]; 数组定义: AINT5 iArray; AFLOA

  • C语言函数指针数组实现计算器功能

    目录 一.概念 二.用途 三.案例:计算器 (1)基础代码编译: (2)使用函数指针数组的实现: 一.概念 数组:一个存放相同类型数据的存储空间. int arr[10]; //数组arr的每个元素是int 指针数组:一个存放指针的数组. int* arr[10]; //数组arr的每个元素是int* 函数指针:一个指向函数的指针,一般用函数名表示. int Add(int x, int y) { return x + y; } int main() { int arr[10] = { 1, 2

  • C语言全方位讲解指针与地址和数组函数堆空间的关系

    目录 一.一种特殊的变量-指针 二.深入理解指针与地址 三.指针与数组(上) 四.指针与数组(下) 五.指针与函数 六.指针与堆空间 七.指针专题经典问题剖析 一.一种特殊的变量-指针 指针是C语言中的变量 因为是变量,所以用于保存具体值 特殊之处,指针保存的值是内存中的地址 内存地址是什么? 内存是计算机中的存储部件,每个存储单元有固定唯一的编号 内存中存储单元的编号即内存地址 需要弄清楚的事实 程序中的一切元素都存在于内存中,因此,可通过内存地址访问程序元素. 内存示例 获取地址 C语言中通

  • C语言零基础讲解指针和数组

    目录 一.指针和数组分析-上 1.数组的本质 2.指针的运算 3.指针的比较 4.小结 二.指针与数组分析-下 1.数组的访问方式 2.下标形式 VS 指针形式 3.a 和 &a 的区别 4.数组参数 5.小结 一.指针和数组分析-上 1.数组的本质 数组是一段连续的内存空间 数组的空间大小为 sizeof(array_type) * array_size 数组名可看做指向数组第一个元素的常量指针 下面看一段代码: #include <stdio.h> int main() { int

  • C语言详细讲解指针数组的用法

    目录 1. 指针数组定义方法 2. 指针的指针(二级指针) 3. 字符串和指针 4. 数组指针 定义方法 数组指针的用法 1. 指针数组定义方法 格式: 类型说明符 *数组名[ 元素个数 ] int *p[10]; // 定义了一个整型指针数组p,有10个元素,都是int *类型的变量 指针数组的分类: 同指针类型的分类,见上一篇 大多数情况下,指针数组都用来保存多个字符串. #include <stdio.h> int main() { char *name[5] = {"Hell

  • 深入理解C语言中使用频率较高的指针与数组

    目录 定义 指针与二维数组 指针数组与数组指针 数组指针的应用 操作 总结 定义 指针:C语言中某种数据类型的数据存储的内存地址,例如:指向各种整型的指针或者指向某个结构体的指针. 数组:若干个相同C语言数据类型的元素在连续内存中储存的一种形态. 数组在编译时就已经被确定下来,而指针直到运行时才能被真正的确定到底指向何方.所以数组的这些身份(内存)一旦确定下来就不能轻易的改变了,它们(内存)会伴随数组一生. 而指针则有很多的选择,在其一生他可以选择不同的生活方式,比如一个字符指针可以指向单个字符

  • C语言详细讲解多维数组与多维指针

    目录 一.指向指针的指针 二.二维数组与二维指针 三.数组名 四.小结 一.指向指针的指针 指针的本质是变量 指针会占用一定的内存空间 可以定义指针的指针来保存指针变量的地址值 为什么需要指向指针的指针? 指针在本质上也是变量 对于指针也同样存在传值调用与传址调用 下面看一个重置动态空间大小(从 size 到 new_size)的代码: #include <stdio.h> #include <malloc.h> int reset(char** p, int size, int

  • C语言 详细讲解数组参数与指针参数

    目录 一.C语言中的数组参数退化为指针的意义 二.二维数组参数 三.等价关系 四.被忽视的知识点 五.小结 一.C语言中的数组参数退化为指针的意义 C 语言中只会以值拷贝的方式传递参数 当向函数传递数组时: 将整个数组拷贝一份传入函数        × 将数组名看做常量指针传数组首元素地址    √ C 语言以高效作为最初设计目标: a) 参数传递的时候如果拷贝整个数组执行效率将大大下降. b) 参数位于栈上,太大的数组拷贝将导致栈溢出. 二.二维数组参数 二维数组参数同样存在退化的问题 二维数

  • C语言sizeof和strlen的指针和数组面试题详解

    目录 一.概念 sizeof: strlen: 二.例题及解析 2.1 一维数组 2.2 字符数组 2.3 二维数组 三.总结 一.概念 sizeof: sizeof操作符的结果类型为size_t,(它在头文件用typedfe定义为unsigned int类型),计算的是分配空间的实际字节数.sizeof是运算符,可以以类型.函数.做参数 . strlen: strlen结果类型也为size_t(size_t strlen( const char *string )),但strlen是计算的空间

  • C语言例题讲解指针与数组

    目录 1.概要复习 2.指针与数组笔试题 2.1一维数组 2.2字符数组 2.3字符串数组 2.4字符串指针 2.5二维数组 1.概要复习 本篇的内容主要围绕指针与数组.指针与字符串等之间的关系,以及进一步理解sizeof .strlen 的使用与意义. 数组是指具有相同类型元素的集合,字符串常量是一个指向在连续空间里存放的字符的首字符的地址的指针.我们会在下面理解数组与字符串数组的不同. sizeof 是一个操作符,是计算类型空间大小的.strlen 是针对字符串的库函数,用来求字符串的长度.

  • C语言全方位讲解指针的使用

    目录 一.指针的概念 1.1.变量和地址 1.2.指针变量和指针的类型 二.指针变量 2.1.指针变量的定义及使用 2.2.指针运算 三.野指针 3.1.概念: 3.2.野指针的成因 3.3.如何规避野指针 四.字符指针 4.1.字符指针类型 4.2.例题 五.指针与数组 5.1.指针与二维数组 5.2.多级指针 六.指针数组 七.数组指针 7.1.数组指针的定义 7.2.&数组名与数组名 7.3.数组指针的使用 八.指针与函数 8.1.函数指针的定义 8.2.指向函数的指针 总结 接着上次的函

  • C语言 深入浅出讲解指针的使用

    目录 一.利用指针倒序字符串 二.题目实例 三.总结 一.利用指针倒序字符串 void _reversal(char* left, char* right) { while (left < right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } 通过上述代码不难看出,left与right分别代表一个字符数组的首端和尾端,通过中间变量 tmp进行首尾交换,left++中的left是char*类型,同

  • C语言深入讲解指针与结构体的使用

    目录 1 啥是指针 1.1指针与指针变量 1.2总结 2 指针和指针类型 2.1指针+-整数 3 野指针 3.1 野指针的成因 1指针未初始化 2指针越界访问 3指针指向的空间释放 3.2 如何避免野指针的出现 4 二级指针 5 指针数组 6 结构体 6.1 结构的声明 6.2 结构体变量的定义和初始化 6.3 结构体的访问 6.4 结构体传参 1 啥是指针 刚刚接触指针的同学肯定会很懵逼,指针是啥啊?指南针哈哈,不和大家开玩笑,我们进行正题吧,指针是本质是就是地址,但我们要注意我们口头上常说的

  • 详解C语言中的指针与数组的定义与使用

    指针的特点 他就是内存中的一个地址 指针本身运算 指针所指向的内容是可以操作的 操作系统是如何管理内存的 栈空间 4M~8m的大小 当进入函数的时候会进行压栈数据 堆空间 4g的大小 1g是操作系统 全局变量 内存映射 可以对内存的内容修改修改硬盘的内容 一般在数据库中经常使用 内存的分配与释放 c语言分配内存的方法 // malloc(需要分配的大小): 这里的分配的大小需要对齐的2的指数 void *mem = malloc(size); 释放内存 // 一般分配的内容都是在堆空间中的 //

  • C语言指针引用数组案例讲解

    前言:C语言中指针玩的是什么,是内存,要想学好指针的小伙伴们要先对数据在内存中是怎么玩的做一番了解~       当在程序中定义一个变量时,系统会根据其数据类型为其开辟内存空间,例如Visual C++为整型变量分配四个字节的空间,为单精度浮点型变量分配四个字节,为字符型变量分配一个字节,内存中每个字节都有自己独立且唯一的一个编号,这就是地址 ,如下图,系统为变量i分配了2000~2004的存储单元. _访问变量的方式_有如下图两种: 第一种直接访问方式,直接通过变量名访问,变量名与地址有一一对

随机推荐