C89:论数组/指针/引用

一.数组

1.整型数组

(1)一维数组

在一维数组中,数组名表示数组的第一个元素的地址

a[i] == *(a+i)  // 在一维数组中,地址a进行加法 i 之后地址偏移,然后 *

 

1
2
3
4
5
6
7
8
9
10
11
12
//一维数组
静态:int array[100];
静态:int array[100]={1,2};  //只初始化前两个元素
静态:int array[100]={0};    //全部置为零
  
  
动态:int* array=new int[100];
     delete[] array;
  
动态:int* array=new int[100](1,2);   
     delete[] array;

 

(2)二维数组

在二维数组中,数组名表示 a[0] 的地址

a[1] == &a[1] [0]  // 在二维数组中,a[1] 表示的是地址,而不是数组元素

a[i] + j == &a[i] [j]  //在二维数组中,a[i] 表示的是地址,进行加法 j之后,也只是地址偏移,而不是数组元素

*(a+i) == a[i]   // 在二维数组中,a[i]表示的是地址,所以 *( *(a+i) + j ) == *(a[i] + j) == a[i][j]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//二维数组
静态:int array[10][10];
静态:int array[10][10]={{1,1},{2,2}};
  
动态:int (*array)[n]=new int[m][n];
     delete[] array;
  
动态:int** array=new int*[m];
     for(i)
        array[i]=new int[n];
     for(i)
        delete[] array[i];
     delete[] array;
  
动态:int* array=new int[m][n];
    delete[] array;

 

(3)多维数组
1
2
int* array=new int[m][3][4];
delete[] array;

 

2.字符数组

char[]表示字符数组

注意:数组名是一个不可修改的常量,不能对数组名进行赋值或者更改

1
2
3
4
5
6
7
8
9
10
11
char a[10];        //一维字符数组
char a[10][5];     //二维字符数组
char a[5]={'a','b'};    //多个字符赋值给字符数组
char a[]={'a','b'};     //多个字符赋值给字符数组
  
char a[5]={"abc"};    //字符串赋值给字符数组
char a[5]="abc";      //字符串赋值给字符数组
char a[]="abc";       //字符串赋值给字符数组
  
//注意:字符串总是以'\0'作为串的结束符,编译器已经在末尾自动添加了'\0'

 

3.数组传参

(1)一维数组传参
1
2
3
4
//一维数组传参
void func(int* array);
  
void func(int array[]);
 (2)二维数组传参
1
2
3
4
//二维数组传参
void func(int** array);
  
void func(int (*array)[n]);

 

二.指针

1.char*

char*表示字符指针

1
2
3
4
char* p="test";
char* p={"test"};
  
//由于p指针指向的是字符串常量,所以推荐这样写:const char* p="test";

 

3.智能指针

4.二维指针和三维指针

 

三.数组和指针

1.char*和char[]的相同

在传递函数参数的时候,字符数组和字符指针可以相互代替

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Test(int* a){
  
    char* a="abc"//局部函数调用后,a指针变量指向的常量地址不会消失
    char a[]="abc"; //局部函数调用后,a数组指向的内存会销毁
}
  
int main(){
  
    int a[]="test"
    int* p;
    p=&a[0];
    p=a+1;
  
    Test(a);
}

 

2.char*和char[]的不同

(1)字符指针是变量,可以改变值,字符数组名是常量,不能变

(2)字符指针指向的字符串常量,不能变,字符数组名指向的内存区域可以变

posted @   言午丶  阅读(379)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示