西充縣住房和城鄉(xiāng)規(guī)劃建設(shè)局網(wǎng)站google網(wǎng)站增加關(guān)鍵詞
導(dǎo)語
本次授課的內(nèi)容如下:指針,指針和數(shù)組
輔助教材為 《C語言程序設(shè)計(jì)現(xiàn)代方法(第2版)》
指針
指針變量
計(jì)算機(jī)按字節(jié)劃分地址,每個(gè)地址訪問一個(gè)字節(jié)
指針變量指向變量的地址,指的是變量第一個(gè)字節(jié)的地址
int *p;
int i,j,a[10],*p,*q;
int *x;
double *y;
char *z;
sizeof(x);
相關(guān)運(yùn)算符
取地址符&
int x;
int *p;
p=&x;//指針變量存儲(chǔ)了地址
scanf("%d",&x);
scanf("%d",p);//等價(jià)int i,*p=&i;
間接尋址符*
int x,*p=x;//p是x的別名
x=10;
printf("%d\n",*p);
int y=*&x;
*p=3;
printf("%d %d\n",x,y);
賦值
淺復(fù)制:指針指向的是同一個(gè)數(shù)據(jù)
具體講解書上例子
int i,j,*p,*q;
p=&i;
q=p;
*q=*p;
作參
可以完成對(duì)輸入?yún)?shù)的修改
#inlcude <stdio.h>
#include <stdlib.h>
void decompose(double x, long *int_part, double *frac_part)//傳入的是地址
{*int_part = (long) x;*fract_part = x - *int_part;
}
int main()
{int i;double d;decompose(3.14159, &i, &d);printf("%d %f",i,d);
}
示例程序
#include <stdio.h>
#define N 10
void max_min(int a[], int n, int *max, int *min);
int main(void)
{int b[N], i, big, small;printf("Enter %d numbers: ", N);for (i = 0; i < N; i++)scanf("%d", &b[i]);max_min(b, N, &big, &small);printf("Largest: %d\n", big);printf("Smallest: %d\n", small);return 0;
}
void max_min(int a[], int n, int *max, int *min)
{int i;*max = *min = a[0];for (i = 1; i < n; i++) {if (a[i] > *max)*max = a[i];else if (a[i] < *min)*min = a[i];}
}
作返回
示例程序
int *max(int *a, int *b)
{if (*a > *b)return a;elsereturn b;
}
int *p,i,j;
p=max(&i,&j);
//不能返回局部變量的指針
int*find_middle(int a[], int n) {return &a[n/2];
}
指針和數(shù)組
指針?biāo)阈g(shù)運(yùn)算
int*p,a[10];
for(int i=0;i<10;i++)a[i]=i;
p=a;//p指向第一個(gè)元素
p++;//p指向第二個(gè)元素
p+=5;
p--;
p-=2;
int *q=a;
printf("%d %d",q-p,p-q);p>q?p:q;//指針相互比較為同一數(shù)組中的位置
處理數(shù)組
指針可以代替變量i
int a[N], sum, *p;
sum = 0;
//p<a+N也可以
for (p = &a[0]; p < =&a[N-1]; p++)sum += *p;
數(shù)組名做指針
數(shù)組名是定值,不能用來操作
for (p = a; p < a + N; p++)sum += *p;
數(shù)組作為函數(shù)參數(shù)時(shí),直接復(fù)制整個(gè)數(shù)組,但是如果傳入數(shù)組名,就只會(huì)復(fù)制數(shù)組的首地址
int find_largest(int a[], int n)
{int i, max;max = a[0];for (i = 0; i < n; i++)if (a[i] > max)max = a[i];return max;
}
int find_largest(int* a, int n)
{int i, max;max = a[0];for (i = 0; i < n; i++)if (a[i] > max)max = a[i];return max;
}
示例程序
#include <stdio.h>
#define N 10
int main(void)
{int a[N], *p;printf("Enter %d numbers: ", N);for (p = a; p < a + N; p++)scanf("%d", p);printf("In reverse order:");for (p = a + N - 1; p >= a; p--)printf(" %d", *p);printf("\n");return 0;
}
指針和多維數(shù)組
指針可以使得雙循環(huán)變單循環(huán)
for (row = 0; row < NUM_ROWS; row++)for (col = 0; col < NUM_COLS; col++)a[row][col] = 0;for (p = &a[0][0]; p <= &a[NUM_ROWS-1][NUM_COLS-1]; p++)*p = 0;
如果只是處理一行
for (p = a[i]; p < a[i] + NUM_COLS; p++)*p = 0;
處理一列
for (p = &a[0]; p < &a[NUM_ROWS]; p++)(*p)[i] = 0;
數(shù)組是數(shù)組名永遠(yuǎn)會(huì)被編譯器認(rèn)為是一維的,而不是二維,是指向a[0]而不是a[0][0]
總結(jié)和復(fù)習(xí)
本次授課講述第11章和第12章內(nèi)容,關(guān)鍵點(diǎn):指針