C语言初始数组+指针

ゞ 浴缸里的玫瑰 2024-04-06 12:16 117阅读 0赞

文章目录

  • 数组
    • 一维数组
    • 二维数组
    • 数组名是数组首元素的地址
  • 指针
    • 指针类型的意义
    • 野指针
        • 1.非法访问
        • 2.越界访问,数组越界
        • 3.局部变量销毁
    • 如何规律避免野指针
        • 1.指针进行初始化
        • 2.小心指针越界
        • 3.指针指向的空间及时释放 ,既是值为NULL。
        • 4.指针使用之前检查有效性
    • 指针减指针
    • 指针的关系运算
    • 数组和指针
    • 二级指针

数组

一维数组

  1. int arr[10]={
  2. 0};
  3. 只初始第一个位置为0,剩下默认为0

一维数组

[]为下标引用操作符。

数组名是数组首元素的地址。

一维数组在内存中连续存放。

一维数组在内存中连续存放。

随着下标的增长,地址是由低到高持续增长的。

二维数组

  1. int arr[3][4]={
  2. 1,2,3,4,5,6,7,8,9,10,11,12};
  3. 其中第一个[]操作符表示行,第二个操作符[]表示列。
  4. int arr[3][4]={
  5. {
  6. 1,2,3,4},{
  7. 5,6,7,8},{
  8. 9,10,11,12}};
  9. int arr[][4]={
  10. {
  11. 1,2,3,4},{
  12. 5,6,7,8},{
  13. 9,10,11,12}};

二维数组

在二维数组中,行可以省略,列不可以省略。

3ea3df1efeb641fab12a8b7bbb1dbd71.jpeg_pic_center

数组名是数组首元素的地址

  但有两个例外

1.sizeof(数组名),在这里的数组名表示整个数组,计算的是整个数组的大小单位是字节。

2.&数组名,数组名表示整个数组,取出的是整个数组的地址。

指针

  1. &a
  2. 拿到的是a4个字节中第一个字节的地址

指针类型的意义

  1.指针类型决定了,指针解引用的权限有多大。

  2.指针类型决定了,指针走一步能走多远(步长)。
在这里插入图片描述

野指针

1.非法访问
  1. int main()
  2. {
  3. int *p;
  4. //p是一个局部的指针变量,局部变量不初始化的话,默认是随机值。
  5. *p=20;
  6. //非法访问内存
  7. return 0;
  8. }
2.越界访问,数组越界
  1. int main()
  2. {
  3. int arr[10]={
  4. 0};
  5. int* p=arr;
  6. int i=0;
  7. for(i=0;i<12;i++)
  8. {
  9. printf("%d",*(p+i));
  10. }
  11. //数组只占了10个位置,
  12. //但访问的时候一直访问到了第12个位置
  13. //导致了数组越界访问
  14. return 0;
  15. }
3.局部变量销毁
  1. int *test()
  2. {
  3. int a=10;
  4. return &a;
  5. }
  6. //这里的a是局部变量,在出
  7. //test()函数时就被销毁了
  8. int main()
  9. {
  10. int* p=test();
  11. *p=20;
  12. return 0;
  13. }

在这里插入图片描述

如何规律避免野指针

1.指针进行初始化

  当前不知道p应该初始化为什么地址的时候,直接初始化为 NULL

  1. int* p=NULL;
2.小心指针越界
3.指针指向的空间及时释放 ,既是值为NULL。
  1. free(p);
  2. p=NULL;
4.指针使用之前检查有效性
  1. int main()
  2. {
  3. int* p=NULL;
  4. if(p!=NULL)
  5. {
  6. *p=10;
  7. }
  8. return 0;
  9. }

总结: 一个指针变量不知道指向什么地方地时候,指向空指针。当它指向地空间被释放地时候也指向空指针。

指针减指针

得到是两个指针之间的元素变量个数(两个指针要指向同一块空间)

一小段strlen函数的实现

如果不懂可以在这篇博客中理解strlen函数http://t.csdn.cn/jxemH

  1. int my_strlen(char* str)
  2. {
  3. char* start=str;
  4. //将字符串首地址进行备份
  5. while(*str!='\0')
  6. {
  7. str++;
  8. }
  9. //当没有遇到字符'\0'时,指针向后每次移动一位
  10. return str-start;
  11. }

指针的关系运算

   标准规定

允许指向数组元素的指针与指向数组最后一个元素,后面的那个内存位置的指针进行比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

数组和指针

  1. int arr[2]={
  2. 0};
  3. int *p=arr;
  4. //以上*p=arr又可以表示为
  5. arr[2]<==>*(arr+2)<==>*(p+2)<==>*(2+p)<==>*(2+arr)<==>2[arr];

二级指针

  1. int main()
  2. {
  3. int a=10;
  4. int* pa=&a;
  5. //pa是指针变量,一级指针
  6. int * *paa=&pa;
  7. //paa也是个变量,&pa取出pa在内存中起始地址
  8. //paa就是一个二级指针变量
  9. return 0
  10. }

在这里插入图片描述
学的不是技术,更是梦想。

发表评论

表情:
评论列表 (有 0 条评论,117人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C语言-指针数组

    前面已经介绍了指针的基本知识,现在我们将指针与数组结合起来运用。 我们都知道,C语言中定义的数组,在内存中的地址是连续的,比如定义了一个数组 int a[5]

    相关 C语言 指针数组

    指针与数组 在C语言中指针和数组关系十分密切,通过数组下标能完成的操作都可以通过指针来实现。 一般 用指针编写的程序比用数组下标编写的程序执行速度快 声明 int a