编程C本: 帖子 12 – 指针和数组之间的关系, 串
1. 指针和数组 1 晚.
正如在所有 数组 我们知道我们可以将其看作是一个变量数组指针, 这样我们就可以使用数组变量来访问指针方式阵列.
//code by nguyenvanquan7826 #include <stdio.h> void nhapMang(int a[], int n) { int i; for (i = 0; i < n; i++) { printf("Nhap a[%d] = ", i); scanf("%d", &a[i]); } } void nhapContro(int a[], int n) { int i; for (i = 0; i < n; i++) { printf("Nhap a[%d] = ", i); scanf("%d", a + i); } } void xuatMang(int a[], int n) { int i; for (i = 0; i < n; i++) { printf ("%d \t", a[i]); } } int main() { // khai bao mang a co n phan tu int n = 5; int a[n]; nhapContro(a, n); xuatMang(a, n); return 0; }
在上述第一功能与正常打字用, 我就不多说.
在第二功能, 我们只需更换 &通过A I的声明的[20] 是一个被视为一个指针,它会分配内存单元之一行从一个到一个 + 19. 和 + i是一个地址[在] (也就是说,它等同于 &该[在]). 的指针的位置[0].
你也可以声明 1 数组,然后使用 1 指针第一阵列,指针到阵列也.
//code by nguyenvanquan7826 #include <stdio.h> int main() { int n = 5, i; int a[n], *pa; pa = a; // con tro pa tro toi dau mang a for (i = 0; i < n; i++) { printf("Nhap a[%d] = ", i); scanf("%d", pa + i); } for (i = 0; i < n; i++) { printf ("%d \t", *(pa + i)); } return 0; }
你已经注意到了: 为什么我们并不需要分配给指针PA内存仍然使用正常, 因为我们已经声明了一个板[20] 如果机器分配的存储单元阵列来存储, 当我们执行指针阵列的指针PA,那么存储器单元已没有必要分配更多的存储单元进行巴. 考虑下面的例子:
//code by nguyenvanquan7826 #include <stdio.h> #include <stdlib.h> int main() { int n = 5, i; // cap phat bo nho cho pa int *pa = (int *) malloc(n * sizeof(int)); for (i = 0; i < n; i++) { printf("Nhap a[%d] = ", i); scanf("%d", pa + i); } for (i = 0; i < n; i++) { printf ("%d \t", *(pa + i)); } return 0; }
在这个例子中,我们都没有声明为VD前数组中, 所以也不能指向任何位置PA, 但想要做的是,我们需要分配存储单元这样的PA.
2. 输入功能阵列
阵列条目并不总是有利的,因为如前面的例子,我们需要有数组元素的数目之前分配或导入, 所以,如果我们不知道提前元素,用户必须输入阵列功能,星星数量. 你看下面的例子.
//code by nguyenvanquan7826 #include <stdio.h> #include <stdlib.h> void nhapContro(int *(*a), int *n) { int i; printf("Nhap so phan tu cua mang: "); scanf("%d", n); // khong phai &n *a = (int *) malloc ((*n) * sizeof(int)); // *a : lay dia chi cua mang a chu khong phai gia tri cua a for (i = 0; i < *n; i++) { printf("Nhap a[%d] = ", i); scanf("%d", (*a + i)); } } void xuatMang(int *a, int n) { int i; for (i = 0; i < n; i++) { printf ("%d \t", a[i]); } } int main() { int *a, n; nhapContro(&a, &n); // lay dia chi cua a va n xuatMang(a, n); return 0; }
在这个例子中,我们进行的输入和输出功能的数组, 内存分配函数也是. 在节目的标题和说明.
有 1 一点要注意,该函数通过输入一个指针数组,也 2 迹象 *. 1 是阵列的标志 (编号 2), 第一符号也用来传送地址数组的值,可以保持从颚的, 它就像一个标志 * 在功能上 HoanVi(INT *该,INT * B) 所以.
3.指针和字符串
由于性质和特性的字符串是字符数组所以这是类似于阵列 1 晚, 我会说了 1 一点 1 简单的例子.
//code by nguyenvanquan7826 #include <stdio.h> #include <stdlib.h> int main() { char *name; name = (char *) malloc (100*sizeof(char)); printf("What your name? "); gets(name); printf("Oh, Hello %s\n", name); return 0; }
4. 指针和数组 2 晚, 指针数组 - 光标多级
该. 指针和数组 2 晚
上半部分,我们了解指针和数组 1 晚, 而这部分指针和数组 2 方式类似于.
我们知道,计算机存储器阵列存储的本质 2 维数组一样 1 晚. 所以,我们完全可以执行数组 2 像指针维数组 1 晚.
//code by nguyenvanquan7826 #include <stdio.h> #include <stdlib.h> int main() { double a[10][10], *pa; int n, m, i; pa = (double *) a; printf("Nhap so hang va so cot:\n"); scanf("%d %d", &n, &m); for (i = 0 ; i < n * m; i++) { printf("Nhap a[%d][%d] = ", i / m, i % m); scanf("%lf", pa + i); } for (i = 0 ; i < n * m; i++) { if (i % m == 0) printf("\n"); // xuong dong printf("%-5.2lf", *(pa + i)); } return 0; }
结果:
输入的行数和列数:
2
3
导入[0][0] = 4.23
导入[0][1] = 5.7
导入[0][2] = 1.2
导入[1][0] = 8.6
导入[1][1] = 3.456
导入[1][2] = 124.23 5.70 1.20
8.60 3.46 12.00
而且, 我们可能甚至不需要使用PA是 1 指针. 或者你可以输入 1 以同样的方式作为阵列 2 如下正常途径.
你注意为什么我们有 然而, + 在*10 + Ĵ. 这是因为主要功能() 我声明 a[10][10]
应的机器分配给我们的存储单元阵列 2 尺寸的 10 排, 10 列的,如果我们没有用完它仍然存在.
你有没有注意到,我们可以写一个[在][Ĵ] 但 不能写PA[在][Ĵ] 自从宣布它牌匾 2 下午,这样我们就可以写出这么有PA 1 光标当我们分配PA = A,我们认为是一个默认的数组 1 晚. 因此,如果我们只允许写PA[在10+Ĵ] (取值) 和 &然而,[在10+Ĵ] (获取IP地址).
B. 指针数组
指针数组是含有一组指针相同类型的数组.
浮动*一[10]; // 声明一个指针数组. 含 10 指针: 该[0], 该[1], …一个[9]; 是 10 指针.
联系板块 2 这样,我们有以下的意见: 所述阵列的每一行 2 下午我, 1 板 1 晚. 每个指针,然后与关系 1 板 1 晚, 我估计:
//code by nguyenvanquan7826 #include <stdio.h> #include <stdlib.h> int main() { double a[10][10], *pa[10]; int n, m, i, j; printf("Nhap so hang va so cot: "); scanf("%d %d", &n, &m); for (i = 0 ; i < n; i++) { pa[i] = a[i]; // con tro thu i tro den hang thu i for (j = 0 ; j < m; j++) { printf("Nhap a[%d][%d] = ", i, j); scanf("%lf", &pa[i][j]); } } for (i = 0 ; i < n; i++) { printf("\n"); // xuong dong for (j = 0 ; j < m; j++) { printf("%-5.2lf", pa[i][j]); } } return 0; }
我写在本实施例的原因是巴[在][Ĵ] 这是因为各为Pa 1 指针的一维数组. 然而,[在][Ĵ] 也就是说,指针PA的第j个要素[在].
上面的例子,我们认为是一个声明数组[][] 应该不需要分配内存的指针, 现在想分配内存的指针数组 2 像分配维数组 1 这样,我们做了以下:
//code by nguyenvanquan7826 #include <stdio.h> #include <stdlib.h> int main() { double **pa; int n, m, i, j; printf("Nhap so hang va so cot: "); scanf("%d %d", &n, &m); // cap phat n o nho cho n con tro (n hang) pa = (double**) malloc(n * sizeof(double)); for (i = 0 ; i < n; i++) { // cap phat m o nho cho moi con tro (moi hang) pa[i] = (double *) malloc(m * sizeof(double)); for (j = 0 ; j < m; j++) { printf("Nhap a[%d][%d] = ", i, j); scanf("%lf", &pa[i][j]); } } for (i = 0 ; i < n; i++) { printf("\n"); // xuong dong for (j = 0 ; j < m; j++) { printf("%-5.2lf", pa[i][j]); } } return 0; }
它可以被看作一个指针数组, 或一个指向指针的指针 (多级指针).
他oi.cho I / M I%M z是为什么他…. 我不明白这个地方
我什么 / m是当前拾取, 在 % m是取当前列. VD阵列的[10][10] 当i = 21, 当前行 2, 当前列 1. 因为数组 2 方式被认为是排堆垛 1 行作为阵列 1 你喜欢的方式.
哦,还有一个更简单的奥普C ++或不…e为学习…发现C语言只看到他穿梭
目前是仅含有C味儿.
有点亲爱为电子商务问: 在该示例中,通过使用指针水平输入一个函数阵列 2 与注释阵列可以保留它们的值,当出ham.E可以尝试改写功能但具有指针参数的水平1,导致在阵列中仍然得到值用于一个可能的解释为e不?顺便说一句,当问指针需要˚F?
这里的“e码:
#包括
#包括
#包括
无效nhapmang(为int *一,INTñ)
{
为(INT I = 0;在<ñ;我 )
{
的printf("\na[%ð]=",在);
scanf函数("%d",(A + I));
}
}
在无效(为int *一,INTñ)
{
为(INT I = 0;在<ñ;我 )
{
的printf("%d ",该[在]);
}
}
INT主要()
{
为int *一;
INTñ;
A =(INT *)的malloc(N *的sizeof(INT));
的printf("\nNhap n=");
scanf函数("%d",&ñ);
nhapmang(该,ñ);
在(该,ñ);
}
对不起,你有一天不写博客. 阵列保持指针值,当然,让你啊. 因为指针阵列的形式, 没有它更灵活.
N使用光标的水平,当你需要操纵数组f的条件. 由于进入到定义列的行数所需要的函数f阵列, 不需要指针.
他的文章是很细致, 或者和奖励. 感谢您发布. 期待更多的文章都贴! 亲爱.
对于没有兄弟指针部分动态内存分配. 嗨vongj他很快加入这个.
你看一些 9 NHE.
一个OI, Ë不懂网站 “*(*该)” 这是什么先生?
无效nhapContro(INT *(*该), INT * N)
标记 * 首先是保持值时失去作用. 标记 * 样 2 是指一个指针
服务员, 在用于动态分配数组部分 2 维为什么我用这个作为程序不运行这个DC.
*PA = (双*) 的malloc(ñ * 的sizeof(双));
为 (I = 0 ; 在 < ñ; 我 ) {
// M O对葡萄分配给每个指针 (MOI航)
然而,[在] = (双 *) 的malloc(米 * 的sizeof(双));
第一个命令,你需要使用它作为NHE
PA = (双**) 的malloc(ñ * 的sizeof(双));
如何指点串AK的结束位置
为 (I = 0; 在 < *ñ; 我 ) {
的printf("Nhap a[%ð] = ", 在);
scanf函数("%d", (*该 + 在));
}
}
// *n,其中 (*A + I) 在这里我还是不明白这一点, 他经历来帮助你获得香港, 感谢你这么多 :)))
由于n为传递指针, 想用户* N把它的值, * N意味着测量n的值. 应该较长阵列可被用作指针. *该 + i是阵列中的第i个位置.
是的,你的数组的大小 1 常数通常不是可变直流.
INT主要()
{
const int的N = 5;
一个INT[ñ];
nhapContro(该, ñ);
xuatMang(该, ñ);
残培();
回报 0;
}
我问他他们使用数组指针保存名称,并将其保存到缓冲区中,从分离 1 数组名,正在运行的程序停止. 不知道哪里出错,他帮我看看
无效TachTen(字符* S, 字符*一){
int类型l, 在, Ĵ, 到;
I = strlen的(s)-1;
J = 0; K = 0;
升= strlen的(s);
fflush(标准输入);
而(s[在] != ‘ “){
在–;
}
而(在 < 升){
该[Ĵ] = S[I 1];
我 ;
J ;
}
}
无效TachHo(字符* S, 字符* B){
INT I, Ĵ, 到;
I = strlen的(s)-1;
J = K = 0;
fflush(标准输入);
而(s[在] != ' '){
在–;
}
为(J = 0; Ĵ<在; J ){
B[Ĵ] = S[Ĵ];
}
}
案件 3: //在10 SX
的printf("\nn = %d", ñ);
为(I = 0; 在<ñ; 我 ){
该[在] = (字符*)的malloc(100*的sizeof(坦克));
B[在] = (字符*)的malloc(100*的sizeof(坦克));
}
为(I = 0; 在<ñ; 我 ){
TachTen(EN[在].十, 该[在]);
的printf("\nTen sv[%ð]: ", I 1);
为(J = 0; Ĵ<strlen的(该[在]); J ){
的printf("%c", 该[在][Ĵ]);
}
TachHo(EN[在].十, B[在]);
的printf("\nHo sv[%ð]: ", I 1);
为(J = 0; Ĵ<strlen的(B[在]); J ){
的printf("%c", B[在][Ĵ]);
}
}
共同的禁令双洛伊·o·伦而(s[在] !=““){
一世-;
}
在– 新用户.
自己在指针和数组的问题 2 维为什么这个代码
PA = (双 *) 该;
他为什么要加 (双 *) 该; ?.
它被允许投double类型的指针变量. 由于PA指针变量要抛弃这样的.
自己问分配考试时分配数组指针PA = A和PA时行使它= (双 *) 这样一. 感谢 !!
啊与所有的阵列不需要在光标, 你只是做正常OK. 本文概述了单独他的理论对他们之间的关系.
亲爱的地方,我* 10 + PA + J,他可以解释更接近是不是.
PA是一个指针. 然而, + x是更先进的指针x单位. 它相当于一个[X]. 然而, + 在10 * + Ĵ相当于[我* 10 + J].
哦,对f在第一个例子中的一个问题 3 部分 1, 为什么,当E PA CA记忆童装展 3 或 2 存储单元(ñ) DC还是输入足够的 5 分子先生:
PA = (INT *) 的malloc(3 * 的sizeof(INT));
Anh cho em hỏi là ở phần void(INT *(*该), INT * N)
không cần cấp phát bộ nhớ cho n mà vẫn nhập đc à anh ?
Vì khi gọi hàm này dùng &n để truyền địa chỉ vào nên không cần nhé.
Ad mình sử dụng mảng con trỏ để nhập và xuất các ký tự nhưng bị lội mình sữa nhiều lần không được, ad xem giùm mình với:
#包括
#包括
无效纳米羟基磷灰石(char** s, INTñ){
为(INT I = 0;在<ñ;我 ){
的printf("\ns[%ð]=",在);
scanf函数("%s",s[在]);
}
的printf("\ns[%ð]=%s",0,*s[0]);
}
无效xuat(char** s, INTñ){
为(INT I = 0;在<ñ;我 ){
的printf("\ns[%ð]=%s",在,*s[在]);
}
}
INT主要(){
INTñ;
的printf("nhap n:");
scanf函数("%d",&ñ);
字符* S[ñ];
nhap(s,ñ);
的printf("\nMang vua nhap: ");
xuat(s,ñ);
}
em có sử dụng a là con trỏ luôn cho mảng 2 chiều nhưng sao kết quả lại k ra giống như con số đã nhập vậy anh ?
#包括
INT主要()
{
一个INT[10][10];
INTñ,米,在;
的printf(“nhap so hang va so cot : “);
scanf函数(“%d%d”,&ñ,&米);
为(I = 0;在 < n*m;我 )
{
的printf("a[%ð][%ð] :",i/m,i%m);
scanf函数("%d",A + I);
}
为(I = 0;在<n*m;我 )
{
如果(在 % m == 0) 的printf("\n");
的printf("%d ",*(A + I));
}
回报 0;
}
bài viết của anh rất bổ ích.