1:数组与指针
数组的定义与访问:
int a[10] /*定义10个变量的整形数组*/
float f[20] /*定义20个变量的浮点形数组*/
char s[5] /*定义5个变量的字符形数组*/
数组在定义时,可以不指定变量的个数,在访问变量时可以动态改变数组中变量的个数。
char a[];/*定义一个含有不定个数变量的字符数组*/
指针:
指针是一种特殊的数据类型,用来存储一个变量的内存地址。通过一个指针,可以访问这个指针的变量。
指针操作符有*和&两个,分别实现取变量和取地址的操作
例如:
int *p; /定义一个指针变量/
int i=5,j; /定义一个整变量/
p=&i; /取变量i的地址赋值给p/
i=*p; /取指针p的地址赋值给j/
数组和指针
定义一个数组的时候,定义这个数组的头指针,然后分配若干个存储单元。定义的数组名称可以直接赋值给一个指针,而这个指针可以指向这个数组的第一个元素。
例子
#incluede
void main()
{
int i;
int *p;
int a[10];
for (i = 0 ; i < 10; i++)
{
a[i] = i + 10;
}
p=a; //将数组a的指针赋值给p
for(i = 0; i < 10;i++)
{
printf("%d ",*p); // 输出指针p指向的值
p++; //指针p向后移动一个单元
}
printf("\n",*p);
p = p - 4; //指针p向前移动4个单元
printf("%d ",*p);
}
二维数组与指针
int a[4][5];
int *p;
p=a;
数组中变量的指针地址与首指针存在这下面的关系 q = p + (行数*总列数)+ 列数
例子:
#include
void main()
{
int i = 10 , m , n;
int a[4][5];
int *p;
for( m = 0 ; m < 4; m++)
for(n = 0; n < 5;n++)
{
a[m][n] = i;
i++;
}
p=a;
for(m = 0; m < 4; m ++)
for(n = 0 ; n < 5; n++)
{
printf("a[%d][%d] = %d",m,n,*(p+(5*m)+n));
}
printf("\n");
}
函数与指针
函数的声明
在c程序中,自定义函数需要写在被调用的函数的前面。如果前面的函数调用了后面的函数,程序就会发生错误,提示程序中找不到相应的函数,如果需要调用后面的自定义函数,需要在程序最前面声明函数。
函数声明实例:
#include
void myresult(int x);
char result(int aax);
int main()
{
int i =1 ;
while(i != 0)
{
scanf("%d",&i);
myresult(i);
}
void myresult(int x)
{
char s;
if(x > 0 && x <= 100)
{
s = result(x);
printf("%c\n",s);
}
else
{
pritnf("error/\n",s);
}
}
char result(int x)
{
char s ='A';
return s;
}
}
main 函数的参数 argc 与 argv
argc 是一个整形变量,表示参数的个数。*argv[] 是一个指针型数组,数组中的每一个指针指向一个参数的字符数组。
例子:
#include
int main(int argc , char *argv[] )
{
int i;
for(i = 0; i < argc ; i++)
{
printf("%s\n",argv[i]);
}
}
函数与指针
函数对参数的调用,有值调用和引用调用两种方法。
值调用:进行函数调用时候,给形式参数分配内存空间,并把实际参数的值直接传递给形式参数,这一过程是参数值的直接传递过程,一旦形式参数获得了值,便于实际参数没有关系。形式参数的变化对实际参数没有任何影响。
引用调用:当用指针或数组作为函数的参数时,可以用指针来访问实际参数的值。形式参数的变化,将直接引起实际参数的变化。
指针参数的简单实例:
#include
void order(int *x , int *y , int *z);
main()
{
int a,b,c;
a = 5;
b = 3;
c = 8;
printf("%d %d %d\n",a,b,c);
order(&a,&b,&c);
printf("%d %d %d\n",a,b,c);
}
void order(int *x , int *y, int *z)
{
int temp;
if(*x > *y)
{
temp = *x;
*x = *y;
*y = temp;
}
if(*x > *z)
{
temp = *x;
*x = *z;
*z = temp;
}
if(*y > *z)
{
temp = *y;
*y = *z;
*z = temp;
}
}
数组作为函数参数实例
数组名即为数组的首地址,可以作为指针变量来使用。
#include
void stradd(char *a, char *b, char *c)
{
while(*a != NULL)
{
*c = *a;
c++;
a++;
}
while(*b != NULL)
{
*c = *b;
c++;
b++;
}
}
int main()
{
char a[30]="abcdefg";
char b[30]="HIJKLMN";
char c[30]="";
printf("a: %s\n",a);
printf("b: %s\n",b);
stradd(a,b,c);
printf("c: %s\n",c);
}
函数返回指针实例
#include
char * stradd(char *a, char *b)
{
char *p;
p=a;
while(*a != NULL)
a++;
while(*b != NULL)
{
*a = *b;
b++;
a++;
}
return (p); //返回指针p
}
int main()
{
char a[30]="abcdefg";
char b[30]="HIJKLMN";
char *c;
printf("a: %s\n",a);
printf("b: %s\n",b);
c=stradd(a,b);
printf("c: %s\n",c);
}