c语言中数组名的本质

c语言中的数组名的本质是什么,数组名是指针吗?

1、数组名是数组元素的首地址
#include <stdlib.h>
#include <stdio.h>
void main()
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8,9, 10};
printf("a:%d &a:%d :%d \n", a, &a);
system("pause");
}
上面的程序中,a &a大小一样,证明a就是数组元素的首地址;

2、数组名是不是指针,看例子:
#include <stdlib.h>
#include <stdio.h>
void main()
{
char str[10];
char *pStr = str;
printf("sizeof(str):%d sizeof(pStr):%d :%d \n", sizeof(str), sizeof(pStr));
system("pause");

}

上面程序中,运算结果是10和4.
结论:如果数组名就是指针,那么str的值应该是4,而结果却是整个数组的大小10;但是,如果str

不是指针,为什么str能赋值给指针呢?
3、数组名是不是指针的指针
#include <string.h>
#include <iostream.h>
int main(int argc, char* argv[])
{
char str1[10] = "I Love U";
char str2[10];
strcpy(str2,str1);
cout << "string array 1: " << str1 << endl;
cout << "string array 2: " << str2 << endl;
return 0;
}
上例中,strcpy函数在c语言函数库中参数是char类型的指针,在上面的程序中str1和str2被当成了

指针用。
结论:数组名是代表一种数据结构,即数组,数组名可以转化为指向数组的指针,而且是一个常量指

针。
4、数组名可作为指针常量
int a[10];
如果对a进行a++操作,程序会编译出错,因为虽然数组名可以转换为指向其指代实体的指针,但是它

只能被看作一个指针常量,不能被修改。

5、数组名作为函数参数会退化为指针
#include <iostream>
void arrayTest(char str[])
{
 cout << sizeof(str) << endl;
}
int main()
{
 char str1[10] = "I Love U";
 arrayTest(str1);
  return 0;
}

上面的程序中,输出结果为4.
结论:当数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针,而且在函

数体内可以作自增、自减等操作,可以被修改。

在形参里面出现的如char buf[30],int a[10]等c/c++编译器会把它当做指针,也不会主动的多分配

内存,c/c++编译器会自动优化。

6、数组名扩展:
#include <stdlib.h>
#include <stdio.h>
void main()
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8,9, 10};
printf("a:%d &a:%d :%d \n", a, &a);
printf("a+1:%d &a+1:%d \n", a+1, &a +1 );
}
以上例子a和&a大小一样,说明a是数组首元素的地址,而a+1和&a +1大小不一样,其实质是数据类型

不一样,也就是指针的步长不一样;
char a[20];a代表字符数组元素的首地址,类型为char *,它的步长为1;&a代表也是字符数组的首地

址,类型为char[],步长为20;
char b[10][30];b代表二维数组元素首地址,是个指针,类型为char(*a)[30],步长为30;&b也是二

维数组元素首地址,类型为char[10][30],步长为300;

时间: 2024-10-31 15:25:21

c语言中数组名的本质的相关文章

对于C语言中数组名是指针的理解

我们都知道,c语言中数组名是一个指针,比如下面这段代码 #include<iostream>using namespace std;int main(){ int a[4]={1,2,3,4}; for(int i=0;i<4;i++) {  cout<<*(a+i);//*(a+i)和a[i]是等价的.  cout<<endl; } return 0;} 但是看下面这个代码 #include<iostream>using namespace std;

c语言中数组名和指针变量的区别

编译器工作原理:在64位的计算机中,当创建一个指针变量时,计算机会为它分配8个字节的存储空间.但如果创建的是数组呢?计算机会为数组分配存储空间,但不会为数组变量分配任何空间,编译器仅在出现它的地方把它替换成数组的起始地址. 结论1:由于计算机没有为数组变量分配空间,也就不能把它指向其他地方.例题: char s[]="How big is it?"; char *t=s; //正确,将数组的地址赋给指针变量t s=t; //错误,数组变量没有存储空间,无法存储指针变量t的值,编译报错

C语言 对数组名取地址

作者 : 卿笃军 你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算.这会出现什么样的结果呢? 示例: int a[5] = {1,2,3,4,5}; int *p = (int *)(&a+1); printf("%d\n",*(p-1)); 这个输出会是多少呢? 咦?为什么第二行需要强制转化类型呢? 答:a是一个一维数组的名字,&a相当于一个指向一维数组的指针.怎么感觉这么熟悉?指向数组的指针,那不就是行指针吗?int (*p)[]. 行指针+1,就是

C语言之数组名的含义

一:一维数组 int a[5]; a:就是数组名.a做左值时表示整个数组的所有空间(10×4=40字节),又因为C语言规定数组操作时要独立单个操作,不能整体操作数组,所以a不能做左值:a做右值表示数组首元素(数组的第0个元素,也就是a[0])的首地址(首地址就是起始地址,就是4个字节中最开始第一个字节的地址).a做右值等同于&a[0]; a[0]:表示数组的首元素,也就是数组的第0个元素.做左值时表示数组第0个元素对应的内存空间(连续4字节):做右值时表示数组第0个元素的值(也就是数组第0个元素

C语言中变量名及函数名的命名规则与驼峰命名法

一.C语言变量名的命名规则:(可以字母,数字,下划线混合使用) 1. 只能以字母或下划线开始:2. 不能以数字开始:3. 一般小写:4. 关键字不允许用(eg:int float=2//error  float 为保留字不允许用): 二.函数名的命名规则 1.见名知意:2.自定义函数函数名首字母大写(库函数里的函数名都是以小写字母定义,为了区分库函数和自定义函数,避免冲突). 三.宏定义里面的变量 全大写 eg:#define SIZE 100(后面函数所有出现的SIZE全用100代替,它在所有

C语言中函数参数传递的本质是值传递

数组名做函数参数进行传递时,实际上是是一份该指针的拷贝. 给形参赋予其他值,并不影响实参的值. 类似于: int *p = a;    //a为数组名 p = b;          //b为数组名 当然,如果你传递了一个指向某个变量的指针,而函数对该指针执行了间接访问操作,那么函数就可以改变那个变量,但参数还是传值方式传递的,这是两个概念,不矛盾. 对于字符串复制函数strcpy: void strcpy(char *buffer, char const *string) { while((*

C语言中数组与指针

数组是内存空间的一片连续的区域,用于存贮一组相同数据类型元素的集合. 指针变量中存放的是变量的地址,通过指针取得地址,再通过地址提取数据. 在大多是C语言书中,都有这样的说法,“数组和指针是相同的”.其实,数组与指针,只能在特定的情况下才是相同的,在大多书情况下,他们并不相同. C语言中每个表示变量的符号都代表一个地址,而每个变量的值就是该地址里所存储的内容. 定义一个字符数组 char a[]="asdfghjkl";现在来访问第i个字符a[i],编译器符号表中具有一个符号,它代表的

C语言中数组名作为参数进行函数传递

用数组名作函数参数与用数组元素作实参有几点不同. 1) 用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的.因此,并不要求函数的形参也是下标变量.换句话说,对数组元素的处理是按普通变量对待的.用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明.当形参和实参二者不一致时,即会发生错误. 2) 在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元.在函

【C语言】数组名传递给函数,数组的sizeof变为4的原因

C语言中,数组名作为参数传递给函数时,退化为指针,sizeof对指针操作结果应该是4.例子如下: #include<iostream> using namespace std; void Swap_arr(char* charArr){ int len = sizeof(charArr); cout << "len =" << len << endl; //输出len =4 } int main(){ char charArr[] = &