C语言中,如何定义一个‘指针数组’,这个‘指针数组’专门用来存放‘数组指针’。 C语言中 定义一个int a[10]数组以及 指针组(*pr...

C\u8bed\u8a00 \u5982\u4f55\u5b9a\u4e49\u4e00\u4e2a\u4e8c\u7ef4\u6307\u9488\u6570\u7ec4\uff1f

\u5b9a\u4e49\u4e8c\u7ef4\u6307\u9488\u6570\u7ec4\u4e0e\u5b9a\u4e49\u4e00\u7ef4\u6307\u9488\u6570\u7ec4\u5dee\u4e0d\u591a\uff0c\u53ea\u662f\u77e9\u9635\u7684\u7ef4\u5ea6\u589e\u52a0\u4e86\u4e00\u7ef4\u800c\u5df2\u3002

\u4e0b\u9762\u901a\u8fc7\u5177\u4f53\u7684\u5b9e\u4f8b\u6765\u8bf4\u660e\u5982\u4f55\u5b9a\u4e49\u4e00\u4e2a\u4e8c\u7ef4\u6570\u7ec4
int *p[2][3]; // \u5b9a\u4e49\u4e00\u4e2a\u4e8c\u7ef4\u6570\u7ec4\uff0c\u53ea\u662f\u5b9a\u4e49\uff0c\u5e76\u6ca1\u6709\u5206\u914d\u5730\u5740\u7a7a\u95f4int i,j; // \u6570\u7ec4\u7684\u884c\u6570\u548c\u5217\u6570// \u4e0b\u9762\u76842\u4e2afor\u5faa\u73af\u662f\u7528\u6765\u5bf9\u4e8c\u7ef4\u6307\u9488\u6570\u7ec4\u8fdb\u884c\u521d\u59cb\u5316\u7684\uff0c\u4e5f\u5373\u5206\u914d\u5730\u5740\u3002\u5982\u679c\u4e0d\u8fdb\u884c\u521d\u59cb\u5316\u64cd\u4f5c\uff0c\u5c31\u4f1a\u4f7f\u6307\u9488\u53d8\u4e3a\u91ce\u6307\u9488\uff08\u5373\u6307\u5411\u4e0d\u660e\uff09\u3002for(i=0; i<2; i++) for(j=0; j<3; j++) p[i][j] = (int *)malloc(sizeof(int));*p[0][1] = 2; // \u5bf9\u6307\u9488\u6570\u7ec4\u4e2d\u6307\u9488\u6240\u6307\u5411\u7684\u5185\u5b58\u5355\u5143\u8fdb\u884c\u8d4b\u503c\u64cd\u4f5cprintf("%d\n", *p[0][1]); // \u8f93\u51fa\u7ed3\u679c

\u4e00\u3001\u4f60\u7684\u9898\u76ee\u4e0d\u5b8c\u6574\uff0c\u5148\u628a\u9898\u76ee\u8865\u5145\u5b8c\u6574\uff0c\u662f\u4e0d\u662f\u4e0b\u9762\u8fd9\u6837\uff08\u3010\u3011\u5185\u662f\u8865\u5145\u5185\u5bb9\uff09\uff1a
\u201cC\u8bed\u8a00\u4e2d \u5b9a\u4e49\u4e00\u4e2aint a[10]\u6570\u7ec4\u4ee5\u53ca \u6307\u9488\u7ec4\uff08*pre\uff09[10]\uff0c\u5982\u4f55\u628aa\u7ec4\u6240\u6709\u7684\u5730\u5740\u8d4b\u3010\u503c\u7ed9\u6570\u7ec4pre? \u3011\u201d
\u5982\u679c\u4e0d\u662f\uff0c\u8bf7\u697c\u4e3b\u8865\u5145\u9898\u76ee\u3002
\u4e8c\u3001\u4e0d\u7ba1\u8865\u5145\u7684\u5185\u5bb9\u5bf9\u4e0d\u5bf9\uff0c\u9898\u76ee\u524d\u9762\u7684\u5185\u5bb9\u5df2\u7ecf\u51fa\u73b0\u9519\u8bef\u4e86\uff01
\u56e0\u4e3a\u7528int (*pre) [10];\u5b9a\u4e49\u7684\u53d8\u91cfpre\uff0c\u5e76\u4e0d\u662f\u4e00\u4e2a\u542b\u670910\u4e2a\u5143\u7d20\u7684\u6307\u9488\u6570\u7ec4\uff0c\u800c\u662f\u4e00\u4e2a\u6307\u5411\u4e00\u7ef4\u6570\u7ec4\u7684\u6307\u9488\uff0c\u5176\u672c\u8d28\u662f\u4e00\u4e2a\u6307\u9488\uff01\u6240\u4ee5\u539f\u9898\u76ee\u4e2d\u7684\u53d9\u8ff0\u201c\u6307\u9488\u7ec4\uff08*pre\uff09[10]\u201d\u662f\u9519\u8bef\u7684\u3002
\u8981\u60f3\u5b9a\u4e49\u4e00\u4e2a\u6307\u9488\u6570\u7ec4\uff0c\u5e94\u8be5\u7528\uff1aint *pre[10];\u3002\u6ce8\u610f\u4ed6\u4eec\u7684\u533a\u522b\uff0c\u5bf9\uff0c\u591a\u4e86\u4e00\u5bf9\u5c0f\u62ec\u53f7\u5bfc\u81f4\u9519\u8bef\u3002
\u4e09\u3001\u628a\u539f\u9898\u76ee\u6539\u4e3a\u201cC\u8bed\u8a00\u4e2d \u5b9a\u4e49\u4e00\u4e2aint a[10]\u6570\u7ec4\u4ee5\u53ca \u6307\u9488\u6570\u7ec4*pre[10]\uff0c\u5982\u4f55\u628aa\u7ec4\u6240\u6709\u7684\u5730\u5740\u8d4b\u503c\u7ed9\u6570\u7ec4pre? \u201d\uff0c\u5219\u6240\u8fd0\u7528\u7684\u8bed\u53e5\u662f\uff1a
main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int *pre[10],i;
for(i=0;i<10;i++)
pre[i]=&a[i];
}
\u5982\u679c\u6709\u4ec0\u4e48\u95ee\u9898\u8bf7\u7559\u8a00\u3002

指针数组定义int*p[n];

[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,

这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样*p=a;这里*p表示指针数组第一个元素的值,a的首地址的值。

数组指针定义int(*p)[n];

()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。

如要将二维数组赋给一指针,应这样赋值:

int a[3][4];

int(*p)[4];//该语句是定义一个数组指针,指向含4个元素的一维数组。

p=a;//将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]

p++;//该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

扩展资料:

与数组指针关系

数组指针是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动);指针数组是数组元素为指针的数组,其本质为数组。

例如:*p[2]是指针数组,实质是一个数组,里面的两个元素都是指针,[]的优先级比*的优先级高,p先与[]结合,形成数组p[2],有两个元素的数组,再与*结合,表示此数组是指针类型的,每个数组元素相当于一个指针变量

与二维数组对比

二维数组:如char string_1[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。我们可以通过指定下标对其元素进行修改。

指针数组:如char*str_B[5]系统至少会分配5个连续的空间用来存储5个元素,表示str_B是一个5个元素的数组,每个元素是一个指向字符型数据的一个指针。

如果我做这样的定义:

char a[3][8]={"gain","much","strong"};

char*n[3]={"gain","much","strong"};

他们在内存的存储方式分别如右图所示,可见,系统给数组a分配了

3×8的空间,而给n分配的空间则取决于具体字符串的长度。

此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。

由此可见,相比于比二维字符数组,指针数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。

举例编辑

数组指针:

#include&lt;stdio.h&gt;

int main()

{

char c[][4]={"哥","哥","我","岸","上","走"};//UTF-8:一个汉字=3个字节

char(*p)[4];

int i;p=c;//将指针定位于c[0]

for(i=0;i&lt;=5;i++)

{

printf("%s,",*(p+i));//或者将*(p+i)替换成*p++

}

printf("
");

for(i=5;i&gt;=0;i--)

{

printf("%s,",*(p+i));//或者将*(p+i)替换成*--p

}

return 0;

}

指针数组:

#include&lt;stdio.h&gt;

int main()

{

int i;

char*pch[6]={"妹","妹","你","坐","船","头"};

for(i=0;i&lt;6;i++){

printf("%s,",pch&lt;i&gt;);

}

printf("
");

for(i=5;i&gt;=0;i--){

printf("%s
",pch&lt;i&gt;);

}

return 0;

}

参考资料:

百度百科——指针数组




数组指针(也称行指针)
定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
所以数组指针也称指向一维数组的指针,亦称行指针。
指针数组
定义 int *p[n];
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
int *p[3];
int a[3][4];
p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i<3;i++)
p[i]=a[i]
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。

int *arry[10]; //指针数组
int (*arryp)[10]; //数组指针,因为数组指针指向数组,而数组也可看做是个指针,那数组指针可以理解为一个二 级指针
int a[10];
arryp = &a; //将数组地址个数组指针
arry[0] = *arryp; //arry[0]是一级指针,要将数组指针赋给指针数组,就要取内容,实际就是 arry[0] = a;

int **p[10]

其实数组就是指针,想想 printf ("%s",&a) , printf ("%s",a) 的区别哈,数组变量名就是 这个内存块第一个内存地址,一个内存地址是 就是一个指针的内容

“数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int ...”

  • C璇█涓,濡備綍瀹氫箟涓涓鈥鎸囬拡鏁扮粍鈥,杩欎釜鈥樻寚閽堟暟缁勨欎笓闂ㄧ敤鏉ュ瓨鏀锯樻暟缁...
    绛旓細鎸囬拡鏁扮粍瀹氫箟int*p[n];[]浼樺厛绾ч珮锛屽厛涓巔缁撳悎鎴愪负涓涓鏁扮粍锛屽啀鐢眎nt*璇存槑杩欐槸涓涓暣鍨嬫寚閽堟暟缁勶紝瀹冩湁n涓寚閽堢被鍨嬬殑鏁扮粍鍏冪礌銆傝繖閲屾墽琛宲+1鏃讹紝鍒檖鎸囧悜涓嬩竴涓暟缁勫厓绱狅紝杩欐牱璧嬪兼槸閿欒鐨勶細p=a锛涘洜涓簆鏄釜涓嶅彲鐭ョ殑琛ㄧず锛屽彧瀛樺湪p[0]銆乸[1]銆乸[2]...p[n-1],鑰屼笖瀹冧滑鍒嗗埆鏄寚閽堝彉閲忓彲浠ョ敤鏉...
  • c璇█鎸囬拡,鎸囧悜鏁扮粍鐨勬寚閽堛佹寚鍚戞寚閽堟暟缁勭殑鎸囬拡銆佹寚鍚戞暟缁勭殑鎸囬拡鐨勬寚...
    绛旓細瑙g瓟锛1. 濡備綍澹版槑涓涓寚閽堬紝杩欎釜鎸囬拡鏄寚鍚戞暣涓暟缁勭殑锛屾暟缁勬湁n涓厓绱狅紝姣忎釜鍏冪礌鏄痠nt锛屼笉鏄痠nt (*p)[n]锛岃屾槸鏈绠鍗曠殑int*p锛2. 濡備綍澹版槑涓涓寚閽堬紝杩欎釜鎸囬拡涔熸槸鎸囧悜鏁扮粍鐨勶紝鏁扮粍鏈塶涓厓绱狅紝姣忎釜鍏冪礌涓嶆槸int锛岃屾槸鎸囬拡int*锛涜繖涓寚閽堟槸int**p锛3. 鍙堝浣曞0鏄庝竴涓寚閽堬紝瀹冩寚鍚戝彟涓涓寚閽堬紝杩欌...
  • C璇█鏁扮粍鎸囬拡鐨勫厓绱涓暟鎬庝箞瀹氫箟,涓轰粈涔堟槸4?
    绛旓細int (*p)[4]鏄皢p瀹氫箟鎴愪簡鏁扮粍鎸囬拡锛堝嵆鎸囧悜涓缁存暟缁勭殑鎸囬拡锛夈傛棦鐒惰鎸囧悜涓缁存暟缁勶紝灏卞緱鐭ラ亾鍙互鎸囧悜鐨勪竴缁存暟缁勭殑澶у皬锛孾]涓氨鏄寚瀹氬彲浠ユ寚鍚戠殑涓缁存暟缁勭殑澶у皬鐨勩傝岃繖閲4璇存槑鍙兘鐢╬鎸囧悜鍏锋湁4涓猧nt鍏冪礌鐨勪竴缁存暟缁勩傚綋鐒剁敤p鎸囧悜鍒楀ぇ灏忎负4鐨勪簩缁存暟缁勭殑鏌愪竴琛屼篃鏄彲浠ョ殑锛屽氨鍍忓浘涓竴鏍枫備笅闈㈢粰涓緥瀛...
  • c璇█涓庝箞瀹氫箟涓涓瀛楃涓叉暟缁鎸囬拡
    绛旓細c璇█涓畾涔変竴涓瀛楃涓叉暟缁鎸囬拡鍙互杩欐牱鍐:// Example program#include <stdio.h>int main(){ char str[] = "abc"; char *p = str; printf("%s\n", str); printf("%s\n", p); return 0;}
  • C璇█涓浣曞畾涔変竴涓琛鎸囬拡
    绛旓細int (*arryp)[10]; //鏁扮粍鎸囬拡锛鍥犱负鏁扮粍鎸囬拡鎸囧悜鏁扮粍锛岃屾暟缁勪篃鍙湅鍋氭槸涓寚閽堬紝閭f暟缁勬寚閽堝彲浠ョ悊瑙d负涓涓浜 绾ф寚閽 int a[10];arryp = &a; //灏嗘暟缁勫湴鍧涓暟缁勬寚閽 arry[0] = *arryp; //arry[0]鏄竴绾ф寚閽堬紝瑕佸皢鏁扮粍鎸囬拡璧嬬粰鎸囬拡鏁扮粍锛屽氨瑕佸彇鍐呭锛屽疄闄呭氨鏄 arry[0] = ...
  • C璇█鎬庝箞瀹氫箟涓涓瀛楃鎸囬拡鎸囧悜涓涓簩缁村瓧绗︽暟缁勭殑棣栧湴鍧
    绛旓細浜岀淮鏁扮粍涔熸槸鈥滄暟缁勭殑鏁扮粍鈥濇墍浠瀹氫箟涓涓鎸囧悜鐢眒涓厓绱犵粍鎴愮殑涓缁存暟缁鎸囬拡鍗冲彲鎸囧悜浜岀淮鏁扮粍鐨勯鍏冪礌鍦板潃銆傚锛歝har arr[2][2] = { { 'a', 'b' }, { 'c', 'd' } };char (*p)[2];p=arr; // p鎸囧悜棣栧厓绱犲湴鍧銆俢har c = *(p[0]+ 1);// 鎸囧悜0琛1鍒 鍗冲瓧绗 ...
  • 濡備綍瀹氫箟涓涓鎸囧悜鏁扮粍鐨鎸囬拡
    绛旓細(1)绋嬪簭涓璫1锛宑2琚瀹氫箟涓哄瓧绗︽暟缁勫苟鍒濆鍖栵紱c3鏄涓涓寚閽鍙橀噺锛屾寚鍚戝瓧绗︿覆鎵鍦ㄥ瓧绗︽暟缁勭殑棣栧湴鍧銆(2)璇彞char *pArray[3];瀹氫箟浜嗕笁涓厓绱犵殑鎸囬拡鏁扮粍pArray锛屾暟缁勫厓绱犳槸鎸囧悜char鍨嬪彉閲忔垨鏁扮粍鐨勬寚閽堝彉閲忋(3)璇彞pArray[0]=c1;灏嗗瓧绗︽暟缁刢1鐨勯鍦板潃璧嬬粰pArray[0]锛屾寚閽鍙橀噺pArray[0]鎸囧悜浜哻1鐨勯...
  • 濡備綍瀹氫箟涓涓寚閽鎸囧悜涓涓瓧绗︿覆?
    绛旓細鍦c璇█涓畾涔変竴涓寚閽 char*p;charstr[10]="afjkfdhsjk";p=str;鎸囬拡p鎸囧悜瀛楃涓瞫tr鐨勯鍦板潃 C璇█鏄竴闂ㄩ氱敤璁$畻鏈虹紪绋嬭瑷锛屽簲鐢ㄥ箍娉涖侰璇█鐨勮璁$洰鏍囨槸鎻愪緵涓绉嶈兘浠ョ畝鏄撶殑鏂瑰紡缂栬瘧銆佸鐞嗕綆绾у瓨鍌ㄥ櫒銆佷骇鐢熷皯閲忕殑鏈哄櫒鐮佷互鍙婁笉闇瑕佷换浣曡繍琛岀幆澧冩敮鎸佷究鑳借繍琛岀殑缂栫▼璇█銆傚敖绠璇█鎻愪緵浜嗚澶氫綆绾у鐞嗙殑...
  • C璇█涓,瀹氫箟涓涓int a[3][4],濡傛灉瀹氫箟涓涓寚閽鎸囧悜杩欎釜鏁扮粍鍛鐧惧害鐭 ...
    绛旓細int a[3][4]鐨勭被鍨嬫槸int [3][4]锛屼綘瑕瀹氫箟涓涓寚閽鎸囧悜瀹冿紝閭d箞棣栧厛瀹冨緱鏄釜鎸囬拡锛int*p,鐒跺悗鎸囧悜杩欎釜鏁扮粍锛屼笉鑳藉啓int*p[4]杩欐牱鍐欑殑璇漰灏辨槸涓寚閽堟暟缁勪簡锛屽洜涓簆鏄彉閲忥紝鑰孾]鐨勪紭鍏堢骇瑕侀珮浜*锛屾墍浠ュ彧鑳藉啓浣渋nt(*p)[4];
  • c璇█缂栧啓绋嬪簭:瀹氫箟涓涓鍙橀噺,涓涓鎸囬拡,寤虹珛璇ュ彉閲忕殑寮曠敤銆傚鍙橀噺杩涜鍒...
    绛旓細{ int a; // 瀹氫箟涓涓彉閲 int* ptr; // 瀹氫箟涓涓寚閽 int& aa = a; // 寤虹珛鍙橀噺a鐨勫紩鐢 a = 10; // 鍙橀噺a鍒濆鍖栦负10 ptr = &a; // ptr鎸囧悜浜哸 printf("a鐨勫间负锛%d\n", a);ptr = 20; // 閫氳繃鎸囬拡淇敼鍙橀噺a鐨勫 printf("閫氳繃鎸囬拡淇敼鍚庯紝a鐨勫间负锛%d\n", a);a...
  • 扩展阅读:c++中<< ... c语言指针有用吗 ... 在定义一个字符数组时 ... c语言标识符号一览表 ... c语言指针最好的讲解 ... c语言指针定义格式 ... c语言指针经典例题 ... c语言指针为什么危险 ... 在c语言中在定义一个指针变量时 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网