编程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));
你让我问是无效的(INT *(*该), INT * N)
无需分配n的内存,但仍进入 ?
因为在调用此功能时 &n传输地址,因此无需.
广告,我使用指针输入和导出角色,但我多次涉水牛奶, 管理员为我见:
#包括
#包括
无效纳米羟基磷灰石(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,ñ);
}
我将a用作阵列的指针 2 下午 ?
#包括
INT主要()
{
一个INT[10][10];
INTñ,米,在;
的printf(“输入号码,所以 : “);
scanf函数(“%d%d”,&ñ,&米);
为(I = 0;在 < n*m;我 )
{
的printf("a[%ð][%ð] :",我是,我是);
scanf函数("%d",A + I);
}
为(I = 0;在<n*m;我 )
{
如果(在 % m == 0) 的printf("\n");
的printf("%d ",*(A + I));
}
回报 0;
}
他的文章非常有用.