精华内容
下载资源
问答
  • C语言返回数组指针

    2011-08-27 10:06:00
    核心方法,就是定义一个p_array_t的数组指针类型 typedef int (*p_array_t)[ 6 ][ 4 ]; p_array_t TSStyleMake( int i); p_array_t TSStyleMake( int i) {     static ...

     

    核心方法,就是定义一个p_array_t的数组指针类型

    typedef int (*p_array_t)[6][4];

    p_array_t TSStyleMake(int i);

    p_array_t TSStyleMake(int i) {

        

        static int lists[12][6][4] = {

            {

                {,7,1,2},

                {,4,,1},

                {1,6,,1},

                {,6,,},

            },

            {

                {,7,1,2},

                {,4,,1},

                {1,6,,1},

                

            },

        };

        

        int (*list)[6][4] = &lists[i];

        return list;

    }

    转载于:https://my.oschina.net/ahuaahua/blog/30397

    展开全文
  • 数组指针和指针数组这块我总是弄不清楚,总结一下 指针数组:用于存储指针的数组,也就是数组元素都是指针 数组指针:指向数组的指针 关于这部分有一道题:  一个有10个指针的数组,该指针指向一个函数,该函数有...

    在数组指针和指针数组这块我总是弄不清楚,总结一下

    指针数组:用于存储指针的数组,也就是数组元素都是指针

    数组指针:指向数组的指针

    关于这部分有一道题:

           一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型

          这道题一开始我总是弄不清楚
     
           正确答案:int  (*a[10]) (int);
          C的类型系统的派生方法是嵌套,通过类型嵌套进行无限派生。如果声明:int ( *p )( int );
           你可以很容易看明白p是一个函数指针,然后,用a[10]代替那个p,这就是个嵌套的过程,
           即int  (*a[10]) (int)。

    区别:

    类型名称   *数组名称[数组长度];

    int* a[4]     指针数组     

                        表示:数组a中的元素都为int型指针    

                        元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*

    int (*a)[4]   数组指针     

                          表示:指向数组a的指针

                          元素表示:(*a)[i]  

    #include <stdio.h>
    void main(void)
    {
         int c[4]={1,2,3,4};
         int *a[4];          //指针数组
         int (*b)[4];        //数组指针
         b=&c;
         //将数组c中元素赋给数组a
         for(int i=0;i<4;i++)
         {
              a[i]=&c[i];
         }  
         printf("%d\n",*a[1]);       //输出2就对   <pre name="code" class="plain">     printf("%d\n",<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">(*b)[2] </span><span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">);  </span>
    <span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">}  </span>
    
    
    
    

    注意:

    定义了数组指针,必须给指针指定一个数组的首地址

    容易犯的错得就是,不给b地址,直接用(*b)[i]=c[i]给数组b中元素赋值,这时数组指针不知道指向哪里,调试时可能没错,运行时会出现问题,使用指针时要注意这个问题。

    a就不用给他地址,a的元素是指针,for循环内已经给数组a中元素指定地址了。若for循环内写*a[i]=c[i],也会出问题


    了解数组指针,与普通指针及二级指针的区别

    {int a[4][5];int (*p)[5]=a;}

    这里a是个二维数组的数组名,相当于一个二级指针常量;

    p是一个指针变量,它指向包含5int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位;

    *p+i是二维数组a[0][i]的地址;

    *(p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),**(p+2)+3)表示a[2][3]的值。

    (*p)[5]其中的5在上述例子中没有表示任何意思你可以换成除0以外的整数,[5]的作用就是帮助你记忆说你所指向的一维数组的长度。

    (不过除了与定义的二维数组的长度一致的不会警告之外 )其他的数会警告但是不影响结果。

    //(*p)[5]其中的5换成其他的数字在vc++6.0环境中都无法通过编译

    数组指针:

    int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
    int (*p)[4];

    p=a;

    for(int i=0;i<3;i++)
    {

           for(int j=0;j<4;j++)
      {
                 printf("%d",p[i][j]);                //或者 **p+i+j) 或者 *p[i]+j
      }
      printf("\n");
    }

    指针数组:

    int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
    int *p[3];
    for(int ix=0;ix<3;ix++)

    {
      p[ix]=a[ix];

    }

    for(int i=0;i<3;i++)
    {

           for(int j=0;j<4;j++)
      {
               printf("%d",p[i][j]);              //或者    **p+i+j)   或者   *p[i]+j
      }
      printf("\n");
    }






    展开全文
  • 2.数组指针:一个指向数组的指针 3.指针函数:一个返回指针的函数 4.函数指针:一个指向函数的指针 #include<stdio.h> //指针函数,返回数组中的第3个元素的地址 int* N3() { int N[4] = { 1,2,3,4 }; ...

    1.指针数组:一个放了若干指针的数组

    2.数组指针:一个指向数组的指针

    3.指针函数:一个返回指针的函数

    4.函数指针:一个指向函数的指针

    #include<stdio.h>
    
    //指针函数,返回数组中的第3个元素的地址
    int* N3() {
    	int N[4] = { 1,2,3,4 };
    	return &N[2];
    }
    
    //函数指针
    void(*N4)(int* N[], int n);
    
    //输出指针数组中指针所指的内容
    void fun1(int* N[], int n) {
    	printf("指针数组N中的指针分别指向:");
    	for (int i = 0; i < n; i++) {
    		printf("%d,", *N[i]);
    	}
    	putchar(10);
    }
    
    //输出数组指针所指的数组中的内容
    void fun2(int(*N)[4], int n) {
    	printf("数组指针N指向的数组中的元素为");
    	for (int i = 0; i < n; i++)
    		printf("%d,", (*N)[i]);
    	putchar(10);
    }
    
    int main() {
    	int a1 = 1, a2 = 2, a3 = 3, a4 = 4;
    	int* p1 = &a1, * p2 = &a2, * p3 = &a3, * p4 = &a4;//p1,p2,p3,p4分别指向a1,a2,a3,a4的地址
    	int M[4] = { 5,6,7,8 };
    	//指针数组N1存放了指针p1,p2,p3,p4
    	int* N1[4] = { p1,p2,p3,p4 };	
    	fun1(N1, 4);
    	//
    	//数组指针N2指向数组M
    	int(*N2)[4];
    	N2 = &M;
    	fun2(N2, 4);
    	//
    	//调用指针函数N3,获取返回值
    	printf("指针函数N3的返回值为:%d\n", *N3());
    	//
    	//函数指针N4指向函数fun1,
    	printf("函数指针N4指向函数fun1,并调用,");
    	N4 = fun1;
    	N4(N1, 4);
    	return 0;
    }

    参考C语言(函数指针和指针函数)

    展开全文
  • 函数与数组4.1 传递数组给函数4.2 从函数返回数组 2. 初始化 2.1 整体初始化 对比下面三段代码,分析输出。 代码一 int arr[12]; for(int i=0;i<12;++i){ printf("%d ",arr[i]); } 代码二 ...

    2. 初始化

    2.1 整体初始化

    对比下面三段代码,分析输出。

    1. 代码一
    int arr[12];
    for(int i=0;i<12;++i){
        printf("%d ",arr[i]);
    }
    
    1. 代码二
    int arr[12] = {0};
    for(int i=0;i<12;++i){
        printf("%d ",arr[i]);
    }
    
    1. 代码三
    int arr[12] = {2};
    for(int i=0;i<12;++i){
        printf("%d ",arr[i]);
    }
    

    结论:

    1. 数组未初始化,数组里面的值都是随机值。
    2. 数组初始化为{0},数组里面的值都是0。
    3. 数组初始化为{非零值},数组里面第一个值是非零值,其他的值都是0。

    2.2 部分初始化

    int arr[12] = {[2]=2,[5]=5};
    for(int i=0;i<12;++i){
        printf("%d ",arr[i]);
    }
    

    指定下标的值被赋值,其他的值都是0

    2.3 大小

    sizeof函数

    char carr[12];
    int iarr[12];
    double farr[12];
    printf("carr = %d\n",sizeof(carr));
    printf("iarr = %d\n",sizeof(iarr));
    printf("farr = %d\n",sizeof(farr));
    

    sizeof给出整个数组所占据的内容的大小。数组大小=元素大小*数组个数。

    2.4 赋值

    int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
    int arr = days;
    

    这种方式对数组赋值对吗?答案是错误的,daysarr 是数组名,而数组名表示的是数组“第一个元素”的“起始地址”。即 daysarr 表示的是地址,是一个常数,不能将一个常数赋给另一个常数。

    正确的写法是用 for 循环,将数组days 中的元素一个一个赋给数组arr的元素。

    3. 数组与指针

    数组名是数组第一个元素的地址。
    数组下标实现的操作指针也可以实现。

    NO. 操作 下标 指针
    1 i个元素值 arr[i] *(arr+i)
    2 i个元素地址 &arr[i] arr+i

    arr[i]*(arr+i)完全等价;
    &arr[i]arr+i 完全等价。

    所以,遍历数组可以是:

    int arr[] = {1,2,3,4,5,6,7,8};
    for(int i=0;i<8;++i){
        printf("%d\n",*(arr+i)); 
    }
    

    数组名是不可改变的。
    数组下标比较易于理解,数组指针更灵活更高效。

    4. 函数与数组

    4.1 传递数组给函数

    数组作为函数参数时,通常必须再用一个参数传入数组大小。

    返回值类型 函数名(类型 参数名[],int size){
    
    }
    

    或者:

    返回值类型 函数名(类型* 参数名,int size){
    
    }
    

    数组作为参数时,数组退化成指针,不能利用sizeof获取数组大小,也就不能计算数组元素个数。

    4.2 从函数返回数组

    C 语言不允许返回一个完整的数组作为函数的参数。通过指定不带索引的数组名来返回一个指向数组的指针。

    类型* 函数名() {
       return 数组名;
    }
    

    重点

    int arr[] = {1,2,3,4,5,6};
    // sizeof(数组名)
    printf("sizeof(arr) = %ld\n",sizeof(arr));
    // 数组名的值
    printf("arr=%p\n&arr[0]=%p\n",arr,&arr[0]);
    

    数组名的值是地址

    1. 可以使用指针操作:解引用
    2. 数组作为函数参数和返回值时,传指针/地址。
    展开全文
  • C语言数组指针笔记

    2021-05-06 14:01:26
    C语言笔记 字符串: 获取字符串长度:strlen (头文件string.h) 拷贝字符串:strcpy和strncpy (注:目标字符串长度足以容纳原字符串,后者限定拷贝字符串) ...array是指向包含5个元素数组指针 *(array+1
  • 1. 地址算数运算示例 ...指针算数运算 : int *p, array[5];... p 指向一个 int 数组元素, p + i 的地址时数组中第 i 个元素的地址, ...-- char *alloc(int n) 函数 : 传入分配的字符个数, 返回连续字符存储单元指
  • C语言指针数组输出月份

    千次阅读 2018-12-10 21:12:20
    函数getmonth应返回存储了n对应的月份英文名称的字符串头指针。如果传入的参数n不是一个代表月份的数字,则返回指针NULL。 #include &lt;stdio.h&gt; char *getmonth( int n ); i...
  • C语言里的数组指针

    2021-03-21 23:14:24
    对数组地址的理解 1.数组别名本身是一个指针,对数据取下表实际上是先通过下表取...arr会直接返回arr的值,从而使得本来是指向指针指针返回了指向数组第一个元素的指针 所以有结论&arr == &arr[0] == arr 为
  • C语言数组指针

    2018-04-21 10:46:00
    1-指针是有类型的,不同类型的指针影响指针进行算数运算时移动的步长。 2-数组名可以看做一个指向单个元素的指针,但数组名不是变量,不...a返回一个指向整个数组指针。 4-二维数组可以看成以一维数组作为元素的...
  • 以前一直以为数组就是指针,但是直到我发现下面这两句的输出一样的时候,我才发现我错了 #include <stdio.h> int main(){ int a[2]; printf("%#X\n",a); printf("%#X\n",&a); } 数组作为右值的时候...
  • 加密-C语言数组指针

    千次阅读 2012-11-17 12:33:23
    #include #define N 10 //输入 int * enterNumber();...int * enterNumber(){//返回指针变量 //输入 static int ary[N]; printf("输入一组数字:"); for (int i=0; i; i++) { scanf("%d ",&ary[i]); }
  • C语言中有各种比较纠结的结构,容易混淆,也经常说是面试的重点,现在就来总结下各种小纠结;...(在C语言中const修饰的变量是可以用指针来强制改变的,但在C++中是不行的;)  顺便说下const的几个作用:
  • C语言 函数返回数组指针区别

    千次阅读 2017-09-14 10:42:32
    那么为啥函数str3()和str4()可以正常返回数组结果,str5()不可以呢,这是因为,他们三个函数中的数组都存放在内存中的栈中,只是因为数组设置的比较 大为1024,当存放的是小数组“Hello!”时候可以返回是因为内存...
  • 数组指针是一个指针,该指针指向的是一个数组; 定义: int (*p)[size] //数组指针,存储size个int类型的数据 指针函数与函数指针 指针函数 指针函数是一个函数,该函数返回的是一个指针; 函数指针 函数指针是一个...
  • c语言-数组/指针/函数(小结)

    千次阅读 2011-04-13 19:24:00
    int f() f是一個函數,返回一個整型值 int *f() f是一個函數,返回一個整型指針 int (*f)() f是一個函數指針,所指向的函數返回一個整型值 int *(*f)() f是一個函數指針,所指向的...
  • C语言数组

    2020-08-26 11:01:10
    #include <... //sizeof返回数组的长度,取一个数组名的地址所产生的是一个指向数组的指针 int array[5] = {7, 8, 3, 2, 6}; int* p = (int*)(array + 1); //array为指向数组第一个元素的指针常量
  • int *p() //首先p与()结合,说明是个一个函数,在与*结合,所以是一个返回指针的函数,作用和普通函数比是返回一个int型指针 int (*p)() //首先与*结合,说明是一个指针,再与右边()结合,所以是一个指针函数,...
  • #include &lt;stdio.h&gt; int aa(); int bb(); int main() {  char *str1;  char *str2;  str1 = aa();  str2 = bb();  printf("str1 = %s\n ",str1);  printf("...int aa(...
  • C语言数组

    2019-12-10 18:46:23
    在单调有序的数组中查找目标值,并返回索引。 设待查找的数为x,设置三个指针head,mid,tail。判断arry[mid]与x的大小,若等于,则直接返回mid;若小于则将tail=mid-1,更新mid=(head+tail)/2;若大于则将head=...
  • 七:从函数返回数组 八:指向数组的指针 来自: 一:定义 C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合 数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量 二:...
  • ,由于[]的优先级高于*,故 pf先与[]结合,说明它是一个数组,再与*结合说明数组中的元素的类型是指针,再看后面的参数列表,说明每一个指针都指向一个函数的入口地址,并且指向的函数的返回类型为int。int (*pf[])...
  • 首先说下数组指针的区别 char a[] = “abcdefg”; char *p = “abcdefg” ; 1 a就是数组的首地址 2 数组的内容可以修改,指针的内容不可以修改 在ANSI C中,初始化指针是所创建的字符串时常量,被定义为...
  • C语言 动态数组实现

    2015-02-01 01:49:00
    一、概述 C语言是不能直接定义动态数组的,数组必须在初始化时确定长度。 如果要在程序运行时才确定数组的长度,就需要在...分配size个字节的内存空间,返回地址的指针,如果内存不够分,就返回指针NULL。 注意...
  • c语言函数的数组返回指针返回

    千次阅读 2019-04-13 10:09:52
    1先看看第一种,返回数组; #include "stdio.h" char * get_c() { char ch[]="hello"; //这是一个栈空间 char *p; //这也是栈空间 p=ch; printf("%x\n",&ch); printf("%x\n",...
  • C语言数组与函数

    2017-03-13 23:21:02
    数组作为函数形参// 1. 形参是一个指针 void myFunction(int *param) {} // 2....void myFunction(int param[10]) {} // 3....void myFunction(int param[]) {}从函数返回数组int * myFunction() {}实例#include <std
  • 一般情况下声明一个数组之后,比如int array[5],数组名array就是数组首元素的首地址,而且是一个地址常量。但是,在函数声明的形参列表中除外。 在C中, 在几乎所有使用数组的表达式中,数组... sizeof返回整个数组的.
  • 该函数应该返回指向二维数组指针。 我写了这以下代码:c语言数组问题#includeint* put(int *b);int main(){int a[2][3],i,j;system("clear");put(a);for(i=0;i<2;i++){for(j=0;j<3;j++){printf("\na[...
  • 在内存的分配中我们可以见到 void 指针使用:内存分配函数 malloc 函数返回指针就是 void* 型,用户在使用这个指针的时候,要进行强制类型转换,也就是显式说明该指针指向的内存中是存放的什么类型的数据 (int*)ma
  • 指针数组/数组指针的概念 指针函数/函数指针的概念 好了,接下来就针对知识盲点进行复习 先理解一下指针的概念,这里引用课本 计算机硬件系统中的内存拥有大量的存储单元,为方便管理,故为每个存储党员编地址,...
  • c语言数组与sizeof()

    2016-03-05 21:56:46
    我以前的理解是:数组名字就是指向数组首元素的指针...而sizeof()并不是一个函数,而是一个单目运算符,所以sizeof()里写数组名字,返回的就是数组占了多少字节。 例如: char a[10] = {1,2,3}; sizeof(a) = 10;

空空如也

空空如也

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

c语言返回数组指针

c语言 订阅