精华内容
下载资源
问答
  • 指向一维数组的指针与指向一维数组中某个元素的指针的区别???? 先看几段代码吧: 1. #include <stdio.h> int main() { int a[4]={1,3,5,7}; int (* p)[4]; p=&a; printf("a[3]=%d\n",(*p)[3]); ...

    指向一维数组的指针与指向一维数组中某个元素的指针的区别😫

    先看几段代码吧:
    1.

      #include <stdio.h>
    int main()
    {
    	int a[4]={1,3,5,7};
    	int (* p)[4];
    	p=&a;
    	printf("a[3]=%d\n",(*p)[3]);
    	printf("指针p的值=%d\n", p);
    	printf("指针p+1的值=%d\n", p+1);
    	printf("&a的值=%d\n", &a);
    	printf("&a+1的值=%d\n", &a+1);
    	return 0;
    }
    
    运行结果:
    a[3]=7
    指针p的值=1703728
    指针p+1的值=1703744
    &a的值=1703728
    &a+1的值=1703744
    Press any key to continue
    

    分析:int (* p)[4]; p=&a(而不是p=a); 则*p =a ,表示指针p指向含有4个元素的一维数组a,而不是指向数组a的元素, 故p+1=&a+1。又因为数组a为int型,每个元素占4B,每行4个元素,故a+1与a的值应该相差16,所以若p是指向一维数组a,那么p+1与p应该也相差16,运行结果确实如此,可见p确实是指向一维数组a的指针。
    2.

     #include <stdio.h>
    int main()
    {
    	int a[4]={1,3,5,7};
    	int (* p)[4];
    	p=a;
    	printf("a[3]=%d\n",(*p)[3]);
    	printf("指针p的值=%d\n", p);
    	printf("指针p+1的值=%d\n", p+1);
    	return 0;
    }
    

    运行结果:
    在VC++6.0中:

    --------------------Configuration: project1 - Win32 Debug--------------------
    Compiling...
    project1.c
    E:\C-programming-review\project1.c(6) : warning C4047: '=' : 'int (*)[4]' differs in levels of indirection from 'int *'
    Linking...
    
    project1.exe - 0 error(s), 0 warning(s)
    
    a[3]=7
    指针p的值=1703728
    指针p+1的值=1703744
    Press any key to continue
    

    在Visual Studio Code中:

    [Running] cd "e:\C-programming-review\" && gcc project1.c -o project1 && "e:\C-programming-review\"project1
    project1.c: In function 'main':
    project1.c:6:3: warning: assignment to 'int (*)[4]' from incompatible pointer type 'int *' [-Wincompatible-pointer-types]
      p=a;
       ^
    a[3]=7
    指针p的值=6422064
    指针p+1的值=6422080
    
    [Done] exited with code=0 in 0.256 seconds
    

    分析:代码2与代码1的唯一区别就是代码2中是令p=a,并且代码2虽然运行结果与代码1相同,但是无论在VC++6.0还是在VS Code中,编译结果都会有个warning,提示我们在代码中错误地将int * 型指针的值赋给int (* )[4]型指针,这是因为编译系统在编译时会将一维数组名a当作指针来处理。虽然结果是对的,但是实际编程时最好不要这样写,因为p=a=&a[0],则*p=a[0],表示指针p是指向数组元素,而不是指向数组的一行。

     #include <stdio.h>
    int main()
    {
    	int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
    	int (* p)[4];
    	p=a;
    	printf("a[1][1]=%d\n",*(*(p+1)+1));
    	printf("p的值=%d\n",p);
    	printf("p+1的值=%d\n",p+1);
    	return 0;
    }
    
    a[1][1]=11
    p的值=1703696
    p+1的值=1703712
    Press any key to continue
    

    分析: 同理,对于二维数组a, 令p=a,则*p=*a=a[0],显然,a[0]是一维数组名,显然,与上面的代码1.中的一维数组道理相同,这里也表示p是指向一维数组的指针。

     另外,注意以下两条语句的区别。

    int *p[4];  //定义一个指针数组
    int (*)p[4]; // 定义一个指向一维数组的指针
    

    总结: 要区分指向一维数组的指针与指向一维数组中某个元素的指针其实很简单, 重点看如何对指针进行初始化。

    展开全文
  • 指向一维数组的指针变量和指向二维数组的指针变量以及指针数组的区别 一、指向一维数组的指针变量 设一维数组为a[n] 定义方法: *指针变量名 即 *P  这个p一般指向的一维数组的首地址,即p=a,...
    
    

    指向一维数组的指针变量和指向二维数组的指针变量以及指针数组的区别

    一、指向一维数组的指针变量   设一维数组为a[n]

    定义方法:  *指针变量名 即 *P 

    这个p一般指向的一维数组的首地址,即p=a,或者p=&a[0]p,a,&a[0]均指向同一单元,它们是数组a的首地址,也是号元素a[0]的首地址。p+1,a+1,&a[1]均指向1号元素a[1]。类推可知a+i,a+i,&a[i]

    例子:

    main(){ 
    int a[5],i,*pa; 
    pa=a; 
    for(i=0;i<5;i++){ 
    *pa=i; 
    pa++; 
    } 
    pa=a; 
    for(i=0;i<5;i++){ 
    printf("a[%d]=%d\n",i,*pa); 
    pa++; 
    } 
    } 

    二、指向二维数组的指针变量   设一维数组为a[m][n]

    定义方法: (*指针变量名)[长度]  即 (*P)[n]

    长度表示二维数组分解为多个一维数组时, 一维数组的长度,也就是二维数组的列数。

    1、多维数组有关概念

    注意a[0]a[1]a[2]表示的都是对应那行的数组首地址,和数组名,而不是一个元素

    多维数组地址的表示方法    
    设有整型二维数组a[3][4]如下: 
    0 1 2 3 
    4 5 6 7 
    8 9 10 11 
      设数组a的首地址为1000,各下标变量的首地址及其值如图所示。在第四章中介绍过, C语言允许把一个二维数组分解为多个一维数组来处理。因此数组a可分解为三个一维数组,即a[0]a[1]a[2]。每一个一维数组又含有四个元素。例如a[0]数组,含有a[0][0]a[0][1]a[0][2]a[0][3]四个元素。 数组及数组元素的地址表示如下:a是二维数组名,也是二维数组0行的首地址,等于1000a[0]是第一个一维数组的数组名和首地址,因此也为1000*(a+0)*a是与a[0]等效的, 它表示一维数组a[0]0 号元素的首地址。 也为1000&a[0][0]是二维数组a00列元素首地址,同样是1000。因此,aa[0]*(a+0)*a&a[0][0]是相等的。同理,a+1是二维数组1行的首地址,等于1008a[1]是第二个一维数组的数组名和首地址,因此也为1008。 &a[1][0]是二维数组a10列元素地址,也是1008。因此a+1,a[1],*(a+1),&a[1][0]是等同的。 由此可得出:a+ia[i]*(a+i)&a[i][0]是等同的。 此外,&a[i]a[i]也是等同的。因为在二维数组中不能把&a[i]理解为元素a[i]的地址,不存在元素a[i] 

      C语言规定,它是一种地址计算方法,表示数组ai行首地址。由此,我们得出:a[i]&a[i]*(a+i)a+i也都是等同的。另外,a[0]也可以看成是a[0]+0是一维数组a[0]0号元素的首地址, 而a[0]+1则是a[0]1号元素首地址,由此可得出a[i]+j则是一维数组a[i]j号元素首地址,它等于&a[i][j]。由a[i]=*(a+i)a[i]+j=*(a+i)+j,由于*(a+i)+j是二维数组aij列元素的首地址。该元素的值等于*(*(a+i)+j)

    2、指向二维数的指针变量

    定义方法: (*指针变量名)[长度]  即 (*P)[n]

    注意:二维数组i列的元素的地址的表示方法 *(p+i)+j 
    把二维数组a 分解为一维数组a[0],a[1],a[2]之后,设p为指向二维数组的指针变量。可定义为: int (*p)[4] 它表示p是一个指针变量,它指向二维数组或指向第一个一维数组a[0],其值等于a,a[0],或&a[0][0]等。而p+i则指向一维数组a[i]。从前面的分析可得出*(p+i)+j是二维数组i列的元素的地址,而*(*(p+i)+j)则是ij列元素的值。 
    二维数组指针变量说明的一般形式为: 类型说明符 (*指针变量名)[长度其中类型说明符为所指数组的数据类型。“*”表示其后的变量是指针类型。 “长度表示二维数组分解为多个一维数组时, 一维数组的长度,也就是二维数组的列数。应注意“(*指针变量名)”两边的括号不可少,如缺少括号则表示是指针数组(本章后面介绍),意义就完全不同了。 
    [Explain]main(){ 
    static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11}; 
    int(*p)[4]; 
    int i,j; 
    p=a; 
    for(i=0;i<3;i++) 
    for(j=0;j<4;j++) printf("%2d ",*(*(p+i)+j));

    三、指向二维数组的指针变量 

    定义方法: *指针变量名[数组长度]  即 *P[n],每个元素都是指针,即存了n个地址

    注意这里P两侧没有括号,区别于指向多维数组的指针。

    常用语含有多个字符串的数组,如:

    static char *name[]={ "Illegal day", 
    "Monday", 
    "Tuesday", 
    "Wednesday", 
    "Thursday", 
    "Friday", 
    "Saturday", 
    "Sunday"};

    这里name[0],name[1]-----name[7]分别表示这七个字符串的首地址。

    分析上述原因,个人觉得是因为以下区别:

    使用字符串指针变量与字符数组的区别

    字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。 

    1对字符数组作初始化赋值,必须采用外部类型或静态类型,如: static char st[]={“C Language”};而对字符串指针变量则无此限制,如: char *ps="C Language"; 

    2对字符串指针方式 char *ps="C Language";可以写为: char *ps; ps="C Language";

    故对于数组*name[]={ "Illegal day", 
    "Monday", 
    "Tuesday", 
    "Wednesday", 
    "Thursday", 
    "Friday", 
    "Saturday", 
    "Sunday"};可将每个字符串的首地址赋予数组的个元素name[0]----name[7];

    而对数组方式:static char st[]={"C Language"};不能写为:char st[20];st={"C Language"}; 
    而只能对字符数组的各元素逐个赋值。 


    展开全文
  • 指向一维数组的指针

    2020-08-01 19:06:00
    #include<stdio.h> void main() { int *t;...//地址是可以加,+1,+2,表示移动个单位 printf("%d\n",*t); printf("%d\n",*(t++)); //t++表达式使用时t还是原值 //单独使用时,功能
     #include<stdio.h>
    void main()
    {
        int *t;
        int a[3]={1,2,4};
        t=&a[0];//等价于t=a
        
        printf("%d\n",*(t+2));//地址是可以加的,+1,+2,表示移动一个单位
        printf("%d\n",*t);
        printf("%d\n",*(t+1)); //t++表达式使用时t还是原值
                            //单独使用时,功能一模一样,都是让a的值增加1;
                            //不同的是与赋值号“=”一起使用时,y=++a表示先将a的值增加1后,再把值赋给y;
                            //而,y=a++表示先把a的值给y,a自己再增加1.
        printf("%d\n",*(t++));
        printf("%d\n",*(++t));
        printf("%d\n",++*(t));
        printf("%d\n",(*t)++);
        printf("%d",*t);
    
    }
    }
    

    结果如下
    在这里插入图片描述

    展开全文
  • 使用指向一维数组的指针 int (*p)[n] 指向一维数组的指针,元素类型为整型。 #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,...

    问题及代码:

    使用指向一维数组的指针

    int (*p)[n] 指向一维数组的指针,元素类型为整型。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
        int i,j,(*p)[4];
        for(p=a,i=0;i<3;i++,p++)
        {
            for(j=0;j<4;j++)
            {
                printf("%3d ",*(*p+j));// (*p)[j],p[0][j];
            }
        }
        return 0;
    }
    

     

    展开全文
  • 像这样维数组指针应该怎么操作: 首先应该有概念就是二维数组有行、列概念。 第点就是 * 运算符访问列 第二点就是 [ ] 下标运算符也访问到列。 举个例子,a 、 *a 、 a[2] 、 *(a+2) a :a就是首行...
  • C语言之指向一维数组的指针

    万次阅读 多人点赞 2018-04-17 11:41:53
    int array[5] = {1, 2, 3, 4, 5}; // 定义数组 ...上述三条语句分别定义了数组, 指向数组元素的指针和指向数组的指针. 内存情况如图示: 对于指向数组元素的指针很好理解, 但是怎样理解 指向数组的指针...
  • C语言指针指针引例及其要点指针知识点拓充代码案例指针变量的算术运算指针变量作为函数的参数指针与一维数组使用不同方法输出数组元素1~100之间能被9或11整除的数指向一维数组的指针作为函数的参数实现数组升序排列 ...
  • 指向一维数组的指针变量即二维数组的行指针作为函数参数,实现矩阵转置。 按如下函数原型编程计算并输出m×n阶矩阵的转置矩阵。 其中,m和n的值由用户从键盘输入。已知m和n的值都不超过10。 void Transpose(int (*...
  • 1.使用了typedef来替换表示指向一维数组的指针类型,float (*PF)[4]中,PF为指针变量,它所指向 的类型为包含4个float型元素的一维数组,用float (* )[4]来表示,除了变量之外的才是类型,想知道某个变量是什么类型,...
  • 由于[]优先级高,所以*p加括号,int (*p)[4]这种写法首先说明了p是一个指针指向了具有4个int类型的一维数组;所以给p赋值时应该赋有行地址属性地址 int a[2][4]={1,2,3,4,5,6,7,8}; int *p[2]={a[0],a[1]}; ...
  • //利用指针输出一维数组任意列值 #include&lt;stdio.h&gt; int main() { int array[4]={1,2,3,4}; int (p)[4]; p=&amp;array; int i; scanf("%d",&amp;i); printf("%d",(*§+...
  • 我是个C新手,想请教大家,如果把指针数组定义错成int (*p)[4]后,这个东西怎么用,只能指向有四个元素的一维数组
  • //一,指针指向一维数组元素 int a[2]; int *p; p=&a[0]; *p=10; printf(“a[0]=%d”,a[0]); //二,用指针遍历数组元素 1,普通;用数组下标来遍历元素 int a[4]={1,2,3,4}; int i; for(i=0;i<4;i++) { ...
  • 要求用指向一维数组的指针变量即二维数组的行指针作函数参数。程序的运行结果如下:Please enter matrix:1 2 3 4↙1 2 3 4↙1 2 3 4↙The transposed matrix is:111222333444按要求在空白处填写适当的表达式或语句,...
  • 3、 指向一维数组的首元素的指针可以当数组来使用 int a[5]={1,2,3,4,5} int *p=a; a--->1 2 3 4 5 //写一个函数,求出长度为n的一维数组a的所有元素之和 int fun(int a[],int n)//写...
  • 指向一维数组的指针做函数参数

    千次阅读 2019-02-20 15:20:32
    #include&lt;stdio.h&gt; int main() { float score[][4]={{60,70,80,77},{4,5,6,7},{7,8,9,10}}; float *seach(float (*point)[4],int n); float p; int i,k; scanf("%d"......

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,634
精华内容 1,453
关键字:

指向一维数组的指针