指针数组和数组指针的区别与联系(c语言输出二维数组)

指针数组和数组指针有什么区别?

指针数组和数组指针的区别如下:

1. 定义方式不同:指针数组是一个元素为指针类型的数组,而数组指针是一个指向数组的指针。

2. 数据类型不同:指针数组中每个元素都是一个指针,而数组指针本身是一个指向特定类型数据的数组。

3. 访问元素不同:在访问指针数组时,需要首先访问该元素所在的位置,然后使用间接引用操作符(*)来访问该元素所指向的值;在访问数组指针时,可以直接使用下标操作符[]访问其所指向的数组中的元素。

4. 内存布局不同:对于指针数组,每个元素都是一个独立的内存位置,其值存储了相应对象或变量地址;而对于数组指针,它本身也是一个变量,并且存储了整个数组的地址。

C语言二维数组输入与输出?

代码,实现先输入二维数组的行数m和列数n,并再输入m*n个整型数据存到动态二维数组中。最后输出所有二维数组的元素值。

int main()

{

int**p;//定义二维指针。

int m,n;//行数和列数。

int i,j;

scanf(“%d%d”,&m,&n);//输入行数和列数。

if(m<=0||n<=0)return-1;//行数或列数非法。

p=(int**)malloc(sizeof(int*)*m);//申请一组一维指针空间。

for(i=0;i<m;i++)

p<i>=(int*)malloc(sizeof(int)*n);//对于每个一维指针,申请一行数据的空间。

for(i=0;i<m;i++)

for(j=0;j<n;j++)

scanf(“%d”,&p<i>[j]);//输入第i行第j列的数据。其中&p<i>[j]也可以写作p<i>+j或者是*(p+i)+j.功能相同。

printf(“输入的数组为%d行%d列:n”,m,n);

for(i=0;i<m;i++)

{

for(j=0;j<n;j++)//这个循环可以输出一行元素。

printf(“%d”,p<i>[j]);//输出i行j列的元素。

printf(“n”);//每行输入结束加换行符。

}

//释放内存

for(i=0;i<m;i++)

free(p<i>);

free(p);

return 0;

}

扩展资料:

函数:free

功能:与malloc()函数配对使用,释放malloc函数申请的动态内存。(另:对于free(p)这句语句,如果p是NULL指针,那么free对p无论操作多少次都不会出问题。如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。)

用法;void free(void*ptr);

程序例:

C/C++代码如下:

#include<string.h>

#include<stdio.h>

#include<alloc.h>//or#include<malloc.h>

int main(void)

{

char*str;

/*allocate memory for string*/

str=(char*)malloc(10);

/*copy”Hello”to string*/

strcpy(str,”Hello”);

/*display string*/

printf(“String is%sn”,str);

/*free memory*/

free(str);

str=NULL;

return 0;

}

指针数组和string[]有什么区别

  • 其实还想请大家指教担袱曹惶丨耗查同肠括一下下面这个程序的问题:程序的目的是从小到大输出数据,为什么如下程序做不到#include iostreamusing namespace std;int main(){void swamp(int *, int *);int n1, n2, n3;int *p1, *p2, *p3;cout "input 3 integers:";cin n1 n2 n3;p1 = &n1; p2 = &n2; p3 = &n3;if (n1 n2)swamp(p1, p2);if (n1 n3)swamp(p1, p3);if (n2 n3)swamp(p2, p3);cout "the sorted integers:";cout *p1 " " *p2 " " *p3 endl;return 0;}void swamp(int *p1, int *p2){int *p;p = p1; p1 = p2; p2 = p;}
  • 数组指针,顾名思义就是指向一个数组的指针,如: int

C语言中:数组指针与指针数组有什么区别

  • 类型不一样。 数组指针, 本身是指针 指向数组。 定义方式 int (*p)[4];这样的p是单独的变量,是一个单纯的指针。 p可以被赋值。 指针数组,本质是数组,存一组指针, 比如int *p[4];p是一个数组, 包含四个int *元素。 p不能被赋值。 但p[0]到p[3]可以赋值。

数组指针,指针函数和函数指针两组对应的区别

  • 指针数组:一个普通数组,但其类型由元素类型决定,每一个元素是一个指针。数组指针:指向一个数组的第一个元素的指针,通过偏移量可以方向到该数组指定下目标的元素。指针函数:是一个普通函数,但它的返回值是一个指针。函数指针:是一个指向一个函数的指针,可以把这个指针作为参数传进去,调用者用这个指针可以调用对应的函数,.NET里的delegate应该是使用这种机制实现的。其实指针可以实现一些非常叼的功能,当年我就用一个指针数据,保存一对函数指定,然后把这个数组的指针作为参数传到调用方,调用方可以方便地根据需要,选择数据中不同的指针对应的函数来进行调用,实现了灵活的函数数组,例如这实现一个遥控器功能的程序,把每个按钮的功能写成一个函数,然后的把这些函数的指针装入一个数据,根据数据的下标来调用不同的函实,实现不同的功能。这种做法也是挺美妙的。不过成也指针,败也指针,事物必然有两面性的,指针的强大,令C程序员牛逼起来,但如果管理得不好,也会很惨的。如上面提出的数组指针,通过确定首元素地址 +偏移量来访问元素,若你把这个偏移量搞针的,访问了这个数组以外的地址空间,后尝肠佰段脂灯拌犬饱华果可以是很糟糕的,例如我设计过一个视频监控程序的控制协议,其实就是传一堆结构体过去,然后根据预先规定,来分解哪一个位置的第几位表示什么操作,我们在很多次使用这个协议的时候,偏移量算错了,改写了错误的位置的值,程序没有出现错误,可产生了错误的控制效果,这比程序崩溃更糟糕,后者还比较容易发现,前者是产生一些错误的效果,更难排查。

字符指针变量和字符数组的区别

  • 餐桌蹬灿东莞叛麓

在网上看数组名和指针的区别,说int a[10]和*p(p=a 处理)中,a+1是不会过编译的,但是p+1就可以

  • 然后这是一段代码#includestdio.hint main(){float score[ ][4]={{60,70,80,90},{56,89,67,88},{34,78,67,54}};float *search(float(*pointer)[4],int n);float *p;int i,k;printf("enter tne number of student:");scanf("%d",&k);printf("The scores of NO. &d are :n",k);p=search(score,k); *这里的 score是个数组名,但是该实参传到search函数形参里面不是要进行+运算吗?但是这个编译又通过了怎么回事呢*for(i=0;i4;i++) printf("%5.2ft",*(p+i));printf("n");return(0);}float *search(float(*pointer)[4],int n){float *pt;pt=*(pointer+n);return(pt);}
  • 指针+1是移移位,数组变量+1没有意义

C语言中指针数组和数组指针的区别

  • 指针数组的实质是数组,数组中的所有元素都是指针变量,而数组指针的实质则是指针,它指向了数组

数组指针疑问下列*p++和*(p+i)有和区别?

  • main(){int a[10],I,*p;p=a;for(i=0;i10;i++)*(p+i)=i;这里换成*(p++)=i的话还需要在下面加个p=a; 为什么?for(i=0;i10;i++)printf("a[%d]=%dn",i,*(p+i));printf("a[%d]=%dn",i,*p++);这里的i=0时*(p+i)和*p++不是都等于a[0]么?}
  • *(p+i)等效于p[i],即指针p的指向没有变*p++等效于*p,即p[0],然后再p+=1,p的指向改变
版权声明