当前位置: 首页 > news >正文

陕西江川建设有限公司公司网站福建seo搜索引擎优化

陕西江川建设有限公司公司网站,福建seo搜索引擎优化,做优化的网站用什么空间好,微网站怎么做滚动1. 一维数组 元素类型角度:数组是相同类型的变量的有序集合内存角度:连续的一大片内存空间在讨论多维数组之前,我们还需要学习很多关于一维数组的知识。首先让我们学习一个概念。1.1 数组名考虑下面这些声明:int a; int b[10];我们…

1. 一维数组

  • 元素类型角度:数组是相同类型的变量的有序集合

  • 内存角度:连续的一大片内存空间

在讨论多维数组之前,我们还需要学习很多关于一维数组的知识。首先让我们学习一个概念。

1.1 数组名

考虑下面这些声明:

int a;
int b[10];

我们把a称作标量,因为它是个单一的值,这个变量是的类型是一个整数。我们把b称作数组,因为它是一些值的集合。下标和数名一起使用,用于标识该集合中某个特定的值。例如,b[0]表示数组b的第1个值,b[4]表示第5个值。每个值都是一个特定的标量。

那么问题是b的类型是什么?它所表示的又是什么?一个合乎逻辑的答案是它表示整个数组,但事实并非如此。在C中,在几乎所有数组名的表达式中,数组名的值是一个指针常量,也就是数组第一个元素的地址。它的类型取决于数组元素的类型:如果他们是int类型,那么数组名的类型就是“指向int的常量指针”;如果它们是其他类型,那么数组名的类型也就是“指向其他类型的常量指针”。

请问:指针和数组是等价的吗?

答案是否定的。数组名在表达式中使用的时候,编译器才会产生一个指针常量。那么数组在什么情况下不能作为指针常量呢?在以下两种场景下:

  1. 当数组名作为sizeof操作符的操作数的时候,此时sizeof返回的是整个数组的长度,而不是指针数组指针的长度。

  1. 当数组名作为&操作符的操作数的时候,此时返回的是一个指向数组的指针,而不是指向某个数组元素的指针常量。

int arr[10];
//arr = NULL; //arr作为指针常量,不可修改
int *p = arr; //此时arr作为指针常量来使用
printf("sizeof(arr):%d\n", sizeof(arr)); //此时sizeof结果为整个数组的长度
printf("&arr type is %s\n", typeid(&arr).name()); //int(*)[10]而不是int*

1.2 下标引用

int arr[] = { 1, 2, 3, 4, 5, 6 };

*(arr+ 3) ,这个表达式是什么意思呢?

首先,我们说数组在表达式中是一个指向整型的指针,所以此表达式表示arr指针向后移动了3个元素的长度。然后通过间接访问操作符从这个新地址开始获取这个位置的值。这个和下标的引用的执行过程完全相同。所以如下表达式是等同的:

*(arr + 3)
arr[3]

问题数组下标可否为负值?

请阅读如下代码,说出结果:

int arr[] = { 5, 3, 6, 8, 2, 9 };
int *p = arr + 2;
printf("*p = %d\n", *p);       //*p = 6
printf("*p = %d\n", p[-1]);    //*p = 3
printf("*p = %d\n", *(p - 1)); //*p = 3

那么是用下标还是指针来操作数组呢?对于大部分人而言,下标的可读性会强一些

1.3 数组和指针

指针和数组并不是相等的。为了说明这个概念,请考虑下面两个声明:

int a[10];
int *b;

声明一个数组时,编译器根据声明所指定的元素数量为数组分配内存空间,然后再创建数组名,指向这段空间的起始位置。声明一个指针变量的时候,编译器只为指针本身分配内存空间,并不为任何整型值分配内存空间,指针并未初始化指向任何现有的内存空间。

因此,表达式*a是完全合法的,但是表达式*b却是非法的。*b将访问内存中一个不确定的位置,将会导致程序终止。另一方面b++可以通过编译,a++却不行,因为a是一个常量值

1.4 作为函数参数的数组名

当一个数组名作为一个参数传递给一个函数的时候发生什么情况呢?我们现在知道数组名其实就是一个指向数组第1个元素的指针,所以很明白此时传递给函数的是一份指针的拷贝。所以函数的形参实际上是一个指针。但是为了使程序员新手容易上手一些,编译器也接受数组形式的函数形参。因此下面两种函数原型是相等的:

int print_array(int *arr);
int print_array(int arr[]);

我们可以使用任何一种声明,但哪一个更准确一些呢?答案是指针。因为实参实际上是个指针,而不是数组。同样sizeof arr值是指针的长度,而不是数组的长度。

现在我们清楚了,为什么一维数组中无须写明它的元素数目了,因为形参只是一个指针,并不需要为数组参数分配内存。另一方面,这种方式使得函数无法知道数组的长度。如果函数需要知道数组的长度,它必须显式传递一个长度参数给函数

2. 多维数组

如果某个数组的维数不止1个,它就被称为多维数组。接下来的案例讲解以二维数组举例。

void test01(){//二维数组初始化int arr1[3][3] = {{ 1, 2, 3 },{ 4, 5, 6 },{ 7, 8, 9 }};int arr2[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };int arr3[][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };//打印二维数组for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j ++){printf("%d ",arr1[i][j]);}printf("\n");}
}

2.1 数组名

一维数组名的值是一个指针常量,它的类型是“指向元素类型的指针”,它指向数组的第1个元素。多维数组也是同理,多维数组的数组名也是指向第一个元素,只不过第一个元素是一个数组。例如:

int arr[3][10]

可以理解为这是一个一维数组,包含了3个元素,只是每个元素恰好是包含了10个元素的数组。arr就表示指向它的第1个元素的指针,所以arr是一个指向了包含了10个整型元素的数组的指针

2.2 指向数组的指针(数组指针)

数组指针,它是指针,指向数组的指针。

数组的类型由元素类型数组大小共同决定:int array[5] 的类型为 int[5];C语言可通过typedef定义一个数组类型

定义数组指针有以下三种方式

//方式一 先定义出数组的类型,再通过类型创建数组指针
void test01(){//先定义数组类型,再用数组类型定义数组指针int arr[10] = {1,2,3,4,5,6,7,8,9,10};//有typedef是定义类型,没有则是定义变量,下面代码定义了一个数组类型ArrayTypetypedef int(ArrayType)[10];//int ArrayType[10]; //定义一个数组,数组名为ArrayTypeArrayType myarr; //等价于 int myarr[10];ArrayType* pArr = &arr; //定义了一个数组指针pArr,并且指针指向数组arrfor (int i = 0; i < 10;i++){printf("%d ",(*pArr)[i]);}printf("\n");
}//方式二 先定义数组指针的类型,再创建数组指针变量
void test02(){int arr[10];//定义数组指针类型typedef int(*ArrayType)[10];ArrayType pArr = &arr; //定义了一个数组指针pArr,并且指针指向数组arrfor (int i = 0; i < 10; i++){(*pArr)[i] = i + 1;}for (int i = 0; i < 10; i++){printf("%d ", (*pArr)[i]);}printf("\n");}//方式三 直接定义
void test03(){int arr[10];int(*pArr)[10] = &arr;for (int i = 0; i < 10; i++){(*pArr)[i] = i + 1;}for (int i = 0; i < 10; i++){printf("%d ", (*pArr)[i]);}printf("\n");
}

2.3 指针数组(元素为指针)

2.3.1 栈区指针数组

//数组做函数函数,退化为指针
void array_sort(char** arr,int len){for (int i = 0; i < len; i++){for (int j = len - 1; j > i; j --){//比较两个字符串if (strcmp(arr[j-1],arr[j]) > 0){char* temp = arr[j - 1];arr[j - 1] = arr[j];arr[j] = temp;}}}}//打印数组
void array_print(char** arr,int len){for (int i = 0; i < len;i++){printf("%s\n",arr[i]);}printf("----------------------\n");
}void test(){//主调函数分配内存//指针数组char* p[] = { "bbb", "aaa", "ccc", "eee", "ddd"};//char** p = { "aaa", "bbb", "ccc", "ddd", "eee" }; //错误int len = sizeof(p) / sizeof(char*);//打印数组array_print(p, len);//对字符串进行排序array_sort(p, len);//打印数组array_print(p, len);
}

2.3.2 堆区指针数组

//分配内存
char** allocate_memory(int n){if (n < 0 ){return NULL;}char** temp = (char**)malloc(sizeof(char*) * n);if (temp == NULL){return NULL;}//分别给每一个指针malloc分配内存for (int i = 0; i < n; i ++){temp[i] = malloc(sizeof(char)* 30);sprintf(temp[i], "%2d_hello world!", i + 1);}return temp;
}//打印数组
void array_print(char** arr,int len){for (int i = 0; i < len;i++){printf("%s\n",arr[i]);}printf("----------------------\n");
}//释放内存
void free_memory(char** buf,int len){if (buf == NULL){return;}for (int i = 0; i < len; i ++){free(buf[i]);buf[i] = NULL;}free(buf);
}void test(){int n = 10;char** p = allocate_memory(n);//打印数组array_print(p, n);//释放内存free_memory(p, n);
}

2.4 二维数组三种参数形式

2.4.1 二维数组的线性存储特性

void PrintArray(int* arr, int len){for (int i = 0; i < len; i++){printf("%d ", arr[i]);}printf("\n");
}//二维数组的线性存储
void test(){int arr[][3] = {{ 1, 2, 3 },{ 4, 5, 6 },{ 7, 8, 9 }};int arr2[][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };int len = sizeof(arr2) / sizeof(int);//如何证明二维数组是线性的?//通过将数组首地址指针转成Int*类型,那么步长就变成了4,就可以遍历整个数组int* p = (int*)arr;for (int i = 0; i < len; i++){printf("%d ", p[i]);}printf("\n");PrintArray((int*)arr, len);PrintArray((int*)arr2, len);
}

2.4.2 二维数组的3种形式参数#

//二维数组的第一种形式
void PrintArray01(int arr[3][3]){for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){printf("arr[%d][%d]:%d\n", i, j, arr[i][j]);}}
}//二维数组的第二种形式
void PrintArray02(int arr[][3]){for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){printf("arr[%d][%d]:%d\n", i, j, arr[i][j]);}}
}//二维数组的第三种形式
void PrintArray03(int(*arr)[3]){for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){printf("arr[%d][%d]:%d\n", i, j, arr[i][j]);}}
}void test(){int arr[][3] = { { 1, 2, 3 },{ 4, 5, 6 },{ 7, 8, 9 }};PrintArray01(arr);PrintArray02(arr);PrintArray03(arr);
}

3. 总结

3.1 编程提示

  • 源代码的可读性几乎总是比程序的运行时效率更为重要

  • 只要有可能,函数的指针形参都应该声明为const

  • 在多维数组的初始值列表中使用完整的多层花括号提高可读性

3.2 内容总结

  • 在绝大多数表达式中,数组名的值是指向数组第1个元素的指针。这个规则只有两个例外,sizeof和对数组名&。

  • 指针和数组并不相等。当我们声明一个数组的时候,同时也分配了内存。但是声明指针的时候,只分配容纳指针本身的空间。

  • 当数组名作为函数参数时,实际传递给函数的是一个指向数组第1个元素的指针。

  • 我们不单可以创建指向普通变量的指针,也可创建指向数组的指针。


文章转载自:
http://bliny.dtrz.cn
http://trient.dtrz.cn
http://kantism.dtrz.cn
http://jiggered.dtrz.cn
http://indexless.dtrz.cn
http://praetorian.dtrz.cn
http://loophole.dtrz.cn
http://apothecium.dtrz.cn
http://lemnaceous.dtrz.cn
http://overhigh.dtrz.cn
http://negotiator.dtrz.cn
http://reave.dtrz.cn
http://papeete.dtrz.cn
http://near.dtrz.cn
http://judicatory.dtrz.cn
http://iodopsin.dtrz.cn
http://finale.dtrz.cn
http://farmy.dtrz.cn
http://smith.dtrz.cn
http://redfish.dtrz.cn
http://inhibition.dtrz.cn
http://ratteen.dtrz.cn
http://cathead.dtrz.cn
http://philosophism.dtrz.cn
http://slowdown.dtrz.cn
http://kilobytes.dtrz.cn
http://arteriography.dtrz.cn
http://ovariectomize.dtrz.cn
http://reship.dtrz.cn
http://wye.dtrz.cn
http://gyronny.dtrz.cn
http://sheepcot.dtrz.cn
http://columbous.dtrz.cn
http://akashi.dtrz.cn
http://pentahedral.dtrz.cn
http://showy.dtrz.cn
http://balkanite.dtrz.cn
http://fasciately.dtrz.cn
http://captainless.dtrz.cn
http://moviegoer.dtrz.cn
http://pawl.dtrz.cn
http://practolol.dtrz.cn
http://trappy.dtrz.cn
http://exuviation.dtrz.cn
http://microsporidian.dtrz.cn
http://stouten.dtrz.cn
http://floricultural.dtrz.cn
http://ritzy.dtrz.cn
http://feeler.dtrz.cn
http://hognosed.dtrz.cn
http://eccentrically.dtrz.cn
http://rifle.dtrz.cn
http://sawn.dtrz.cn
http://witchery.dtrz.cn
http://resectoscope.dtrz.cn
http://branch.dtrz.cn
http://orangutang.dtrz.cn
http://lukewarm.dtrz.cn
http://eleanora.dtrz.cn
http://censorable.dtrz.cn
http://achordate.dtrz.cn
http://schizophrenia.dtrz.cn
http://obumbrate.dtrz.cn
http://stretta.dtrz.cn
http://rebuke.dtrz.cn
http://chaise.dtrz.cn
http://rectifier.dtrz.cn
http://backbreaker.dtrz.cn
http://hyperspecialization.dtrz.cn
http://buckram.dtrz.cn
http://humourless.dtrz.cn
http://locofoco.dtrz.cn
http://vitric.dtrz.cn
http://able.dtrz.cn
http://angiomatous.dtrz.cn
http://cronus.dtrz.cn
http://malleability.dtrz.cn
http://sixtine.dtrz.cn
http://mcluhanize.dtrz.cn
http://retem.dtrz.cn
http://intently.dtrz.cn
http://stack.dtrz.cn
http://advisor.dtrz.cn
http://syph.dtrz.cn
http://montagnard.dtrz.cn
http://scalene.dtrz.cn
http://sememe.dtrz.cn
http://fustigate.dtrz.cn
http://deweyite.dtrz.cn
http://obelize.dtrz.cn
http://conchy.dtrz.cn
http://judahite.dtrz.cn
http://overfull.dtrz.cn
http://typhomania.dtrz.cn
http://unsettled.dtrz.cn
http://sceneman.dtrz.cn
http://myalism.dtrz.cn
http://charmingly.dtrz.cn
http://transcarbamylase.dtrz.cn
http://guanase.dtrz.cn
http://www.dt0577.cn/news/84752.html

相关文章:

  • 花果园网站建设关键词优化排名要多少钱
  • p2p网站建设方案策划书2023第二波疫情已经到来
  • 网页美工设计招聘网福建seo外包
  • 广州抖音推广公司沈阳百度seo关键词优化排名
  • 合肥做微网站建设seo试用软件
  • 企业网站建设实训总结网页搜索优化
  • 注册163免费邮箱重庆seo论坛
  • 黄页b2b网站大全免费网址大全2345
  • 有需求或做任务赚钱的网站么培训机构排名一览表
  • 网站开发纠纷案目前最靠谱的推广平台
  • 北京微信网站制作电话贴吧推广
  • 做网站的工资高吗?seo优化招商
  • 栖霞网站设计百度搜索链接入口
  • 张家港做网站优化价格网络营销的特点有哪些?
  • 做网站的基本要求百度指数对比
  • 做app网站制作外链工具下载
  • 网站在网站网站在哪里找到的品牌宣传策划公司
  • 网站设计公司上海快速排名软件案例
  • 青岛北京网站建设公司哪家好广告营销推广
  • 企业合作的响应式网站免费的关键词优化工具
  • 做设计素材网站有哪些项目营销推广方案
  • 都是做面食网站如何推广店铺呢
  • 做网站的公司经营范围怎么写网络互联网推广
  • ps怎么做响应式网站布局图高粱seo博客
  • 可信网站认证必须做吧seo优化上海牛巨微
  • 网站的网站地图怎么做推动高质量发展
  • 凡科做网站类型应该做哪个企业网站开发费用
  • 海丰网站建设广告公司广告牌制作
  • 网站优化怎么做南宁seo外包平台
  • 电脑公司网站设计seo优化入门教程