数组与指针:
数组元素的指针就是数组元素的地址
指向数组元素的指针,它的方法与指向变量的指针变量相同
引用一个数组元素可以用:
(1)下标法 如:a[i]形式;
(2)指针法 如:*(a+i)或*(p+i);
a是数组名,p是指向数组元素的指针变量,它的初值p=a
注意:
数组名即翻译成数组的第一个元素的地址,其中a或p是第一个元素的地址,加上i就是指向第i个元素。注意,它不是地址加上i,具体要看是什么类型的。
例题:
输出数组中的全部的元素的方法
(1) 下标法(就是简单地数组的定义,初始化,赋值及应用)
(2) 通过数组名计算数组的元素的地址,找到元素的值
Int I,a[10];
For(i=0;i<10;i++){
Scanf(“%d”,&a[i]);
}
For(i=0;i<10;i++){
Printf(“%d”,*(a+i));
}
(3) 用指针变量指向数组
Int I,a[10],*p;
For(i=0;i<10;i++){
Scanf(“%d”,&a[i]);
}
For(p=a;i<(a+10);p++){
Printf(“%d”,*p);
}
用数组名做函数参数:
C语言调用函数时,虚实结合的方法都是采用“值传递”方式,当用变量名做函数时,传递的是变量的值,当采用数组名作为函数参数时,
由于数组名代表的是数组元素首地址,因此传递的值是地址,所以要求形参为指针变量。
小结:
如果有一个实参数组,想在函数中改变此数组中元素的值,实参与形参的对应关系有以下4中情况:
(1) 形参和实参都用数组名,如:
Int a[10];
F(a,10);
Void f(int x[],int n){}
(2) 实参用数组名,形参用指针变量,如:
Int a[10];
F(a,10);
Void f(int *a,int n){}
(3) 实参形参都用指针变量,如:
Int a[10],*p=a;
F(p,10);
Void f(int *x,int n){}
(4) 实参为指针变量,形参为数组名,如:
Int a[10],*p=a;
F(p,10);
Void f(int x[],int n){}
字符串与指针
字符串中字符的存取可以用下标法,也可以用指针方法
虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但他们还是有区别的:
1. 字符数组有若干个数组元素组成,每个元素中存放一个字符,而字符指针变量中存放的是地址即字符串第一个字符的地址,绝不是将字符串放到字符指针变量中;
2. 赋值方式.字符数组只能对各个元素赋值;
3. 对字符指针变量赋初值;
4. 如果定义一个字符数组,在编译时为他分配内存单元,它有确定的地址.而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址,也就是说,该指针变量可以指向一个字符数据,但如果未对它赋予一个地址值,则它并未具体指向一个确定的字符数据;
如:
char str[10];
scanf("%s",str);
这样编写是完全可以的。经常有人用这样的方法
如:
char *a;
scanf("%s",a);
它的目的是想输入一个字符串,一般也能运行,但这种方法是危险的,因为指针变量没有赋初值时,它是随机指向的。
5. 指针变量的值是可以改变的;
另外,如定义一个指针变量,并使用它指向一个字符串,就可以用下标形式,引用指针变量所指的字符串中的字符.
数组元素的指针就是数组元素的地址
指向数组元素的指针,它的方法与指向变量的指针变量相同
引用一个数组元素可以用:
(1)下标法 如:a[i]形式;
(2)指针法 如:*(a+i)或*(p+i);
a是数组名,p是指向数组元素的指针变量,它的初值p=a
注意:
数组名即翻译成数组的第一个元素的地址,其中a或p是第一个元素的地址,加上i就是指向第i个元素。注意,它不是地址加上i,具体要看是什么类型的。
例题:
输出数组中的全部的元素的方法
(1) 下标法(就是简单地数组的定义,初始化,赋值及应用)
(2) 通过数组名计算数组的元素的地址,找到元素的值
Int I,a[10];
For(i=0;i<10;i++){
Scanf(“%d”,&a[i]);
}
For(i=0;i<10;i++){
Printf(“%d”,*(a+i));
}
(3) 用指针变量指向数组
Int I,a[10],*p;
For(i=0;i<10;i++){
Scanf(“%d”,&a[i]);
}
For(p=a;i<(a+10);p++){
Printf(“%d”,*p);
}
用数组名做函数参数:
C语言调用函数时,虚实结合的方法都是采用“值传递”方式,当用变量名做函数时,传递的是变量的值,当采用数组名作为函数参数时,
由于数组名代表的是数组元素首地址,因此传递的值是地址,所以要求形参为指针变量。
小结:
如果有一个实参数组,想在函数中改变此数组中元素的值,实参与形参的对应关系有以下4中情况:
(1) 形参和实参都用数组名,如:
Int a[10];
F(a,10);
Void f(int x[],int n){}
(2) 实参用数组名,形参用指针变量,如:
Int a[10];
F(a,10);
Void f(int *a,int n){}
(3) 实参形参都用指针变量,如:
Int a[10],*p=a;
F(p,10);
Void f(int *x,int n){}
(4) 实参为指针变量,形参为数组名,如:
Int a[10],*p=a;
F(p,10);
Void f(int x[],int n){}
字符串与指针
字符串中字符的存取可以用下标法,也可以用指针方法
虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但他们还是有区别的:
1. 字符数组有若干个数组元素组成,每个元素中存放一个字符,而字符指针变量中存放的是地址即字符串第一个字符的地址,绝不是将字符串放到字符指针变量中;
2. 赋值方式.字符数组只能对各个元素赋值;
3. 对字符指针变量赋初值;
4. 如果定义一个字符数组,在编译时为他分配内存单元,它有确定的地址.而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址,也就是说,该指针变量可以指向一个字符数据,但如果未对它赋予一个地址值,则它并未具体指向一个确定的字符数据;
如:
char str[10];
scanf("%s",str);
这样编写是完全可以的。经常有人用这样的方法
如:
char *a;
scanf("%s",a);
它的目的是想输入一个字符串,一般也能运行,但这种方法是危险的,因为指针变量没有赋初值时,它是随机指向的。
5. 指针变量的值是可以改变的;
另外,如定义一个指针变量,并使用它指向一个字符串,就可以用下标形式,引用指针变量所指的字符串中的字符.