1.数组名的特殊性
先说结论
数组名代表数组首元素地址,也是一个指针,只读的常量,是一个常量指针,不能修改。
数组首元素的地址和数组地址是两个不同的概念
数组名是数组首元素的起始地址,但并不是数组的起始地址
通过将取地址符&作用于数组名可以得到整个数组的起始地址
int c[200]={0};
c+1 步长四个字节
&c+1步长200*4个字节
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
//c语言中没有字符串类型,通过字符数组来模拟字符串
//C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符
//sizeof(类型)字符串类型,的大小,包括\0;
//C语言中的字符串是以’\0’结束的字符数组
//
void main()
{
char* p = NULL;
char buf[128] = "aadasfa";
//buf代表数组首元素地址,也是一个指针,只读的常量,是一个常量指针,不能修改
//因为如果修改了,释放内存就会出错,所以c编译器规定不能修改
p = buf;
p = p + 1;//这样就不会出错
//buf = buf + 1;这句就会报错
system("pause");
}
数组和指针有明显区别,如图所示
2.const的用法
const
const int a; //
int const b;
const char *c;
char * const d; char buf[100]
const char * const e ;
含义:
//第一个第二个意思一样 代表一个常整形数
//第三个 c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改)
//第四个 d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
//第五个 e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
结论:
//指针变量和它所指向的内存空间变量,是两个不同的概念。。。。。。
//看const 是放在*的左边还是右边 看const是修饰指针变量,还是修饰所指向的内存空变量
3.数组指针、指针数组
指针数组就是数组中的每个元素都是指针
数组指针用于指向一个数组
数组名是数组首元素的起始地址,但并不是数组的起始地址
通过将取地址符&作用于数组名可以得到整个数组的起始地址
定义数组指针的三种方法
void main()
{
//数组指针的第一种定义方式
typedef int(array_type)[5];
array_type poiner;//int a[5]
array_type* pointer2;//
pointer2 = &poiner;//数组指针pointer2 指向数组pointer
//数组指针的第二种定义方式
typedef int(*array_type2)[5];
array_type2 pointer3;
pointer3 = &poiner;
//数组指针的第三种定义方式
int(*pointer4)[5];
pointer4 = &poiner;
}
4.多维数组的本质
//多维数组名的本质是数组指针 指向低维数组的指针 每次往后跳一维的维数 二级指针
//(a+i)代表整个第i行的地址 二级指针
//*(a+i) 代表第i行首元素地址 一级指针
//*(a+i)+j //&a[i][j]
char cbuf[30]; // cbuf(1级指针) 代表数组首元素的地址。。。&cbuf(二级指针) 代表整个数组的地址
//&cbuf +1 等于跳过了整个数组 因为指针跳多少是由他指向的数据类型决定的,指向的数组就一次跳过数组的大小
char array[10][30]; //array是二级指针
//(array + i) //相当于 整个第i行的数组地址 //二级指针 &cbuf
//(*(array+i))//一维数组的首地址 cbuf
//(* (array + i)) + j //相当于第i行第j列的地址。。。。&array[i][j]
//* (( * (array + i)) + j) //相当于第i行第j列的值。。。。<====>array[i][j]