1 一个神奇的程序
== 使用了 【指针】【强制类型转换】两项技术 或规则 ==
== 里面的地址可能需要重新写一下下 ==
- #include "stdio.h"
- main(){
- int a = 3;
- *((int*)0X18FF44) = 8;
- printf("%d\n",a);
- }
#include "stdio.h"
main(){
int a = 3;
*((int*)0X18FF44) = 8;
printf("%d\n",a);
}
2 变量review
== 该程序很简单,但确是最需要理解的 ==
- #include "stdio.h"
- main(){
- int a = 5;
- printf(" a = %d \n", a );
- printf(" size of a is %d\n", sizeof(a) );
- printf(" address of a is 0x%x\n", &a );
- }
#include "stdio.h"
main(){
int a = 5;
printf(" a = %d \n", a );
printf(" size of a is %d\n", sizeof(a) );
printf(" address of a is 0x%x\n", &a );
}
3 一个错误的程序
== 想想为什么 ==
- #include "stdio.h"
- void main(){
- int * a;
- *a = 10;
- printf(" dereference of a is %d\n",*a);
- }
#include "stdio.h"
void main(){
int * a;
*a = 10;
printf(" dereference of a is %d\n",*a);
}
4 数组的另类理解
== int a[4] ==
== a的内容是什么?a的大小是多少 ?==
== 认真体会 ==
- #include "stdio.h"
- void pz(int arr[]){
- printf("size function: %d\n",sizeof(arr));
- }
- void main(){
- int a[]={1,2,3};
- printf("a=0x%x \n",a);
- printf("sizeof a is %d \n",sizeof(a));
- pz(a);
- }
#include "stdio.h"
void pz(int arr[]){
printf("size function: %d\n",sizeof(arr));
}
void main(){
int a[]={1,2,3};
printf("a=0x%x \n",a);
printf("sizeof a is %d \n",sizeof(a));
pz(a);
}
5 指针与数组
== 两个知识点 【指针指向数组】【指针加上一个整数】==
- #include "stdio.h"
- #define SIZE 4
- main(){
- short index;
- short dates[SIZE];
- short *pti=dates; // pointer to integer
- double bills[SIZE];
- double *ptf=bills; // pointer to float
- printf("%20s(%dB) %10s(%dB)\n",
- "short",sizeof(short),"double",sizeof(double));
- for( index = 0 ; index < SIZE ; index ++ )
- printf("pointers + %d: %10p %10p\n",
- index, pti+index, ptf+index );
- }
#include "stdio.h"
#define SIZE 4
main(){
short index;
short dates[SIZE];
short *pti=dates; // pointer to integer
double bills[SIZE];
double *ptf=bills; // pointer to float
printf("%20s(%dB) %10s(%dB)\n",
"short",sizeof(short),"double",sizeof(double));
for( index = 0 ; index < SIZE ; index ++ )
printf("pointers + %d: %10p %10p\n",
index, pti+index, ptf+index );
}
另一个例子
- #include "stdio.h"
- void main(){
- int a[]={10,3,9,7};
- for(int i=0;i<sizeof(a)/sizeof(int);i++)
- printf("the value of a+%d : %d\n",i,*(a+i));
- int *pa1,*pa2,*pa3;
- pa1 = a;
- pa2 = a+2;
- pa3 = &a[3];
- printf("*pa1=%d,*pa2=%d,*pa3=%d\n",*pa1,*pa2,*pa3);
- printf("pa1=%p,pa2=%p,pa3=%p\n",pa1,pa2,pa3);
- printf("pa2-pa1 = %d\n",pa2-pa1);
- }
#include "stdio.h"
void main(){
int a[]={10,3,9,7};
for(int i=0;i<sizeof(a)/sizeof(int);i++)
printf("the value of a+%d : %d\n",i,*(a+i));
int *pa1,*pa2,*pa3;
pa1 = a;
pa2 = a+2;
pa3 = &a[3];
printf("*pa1=%d,*pa2=%d,*pa3=%d\n",*pa1,*pa2,*pa3);
printf("pa1=%p,pa2=%p,pa3=%p\n",pa1,pa2,pa3);
printf("pa2-pa1 = %d\n",pa2-pa1);
}
6 理解函数中的传值、传地址
- #include "stdio.h"
- void change(int a){
- a=2;
- }
- void main(){
- int a=1;
- change(a);
- printf("a is %d\n",a);
- }
#include "stdio.h"
void change(int a){
a=2;
}
void main(){
int a=1;
change(a);
printf("a is %d\n",a);
}
- #include "stdio.h"
- void change(int* pa){
- *pa=2;
- }
- void main(){
- int a = 1;
- int* pa= &a;
- change(pa);
- printf("*pa is %d\n",*pa);
- }
#include "stdio.h"
void change(int* pa){
*pa=2;
}
void main(){
int a = 1;
int* pa= &a;
change(pa);
printf("*pa is %d\n",*pa);
}
7 当函数的参数为指针、为数组时
- #include "stdio.h"
- void changeArray(int ar[]){
- ar[1] = 88;
- }
- void changePointer(int *pa){
- *(pa+2) = 101;
- }
- void main(){
- int a[]={1,2,3};
- changeArray(a);
- changePointer(a);
- for(int i=0;i<sizeof(a)/sizeof(int);i++)
- printf("a[%d]=%d\n",i,a[i]);
- }
#include "stdio.h"
void changeArray(int ar[]){
ar[1] = 88;
}
void changePointer(int *pa){
*(pa+2) = 101;
}
void main(){
int a[]={1,2,3};
changeArray(a);
changePointer(a);
for(int i=0;i<sizeof(a)/sizeof(int);i++)
printf("a[%d]=%d\n",i,a[i]);
}
8 指向函数的指针
- #include "stdio.h"
- void welcomeToBaoding(){
- printf("welcome to Baoding\n");
- }
- void welcomeToXiAn(){
- printf("welcome to XiAn\n");
- }
- void main(){
- void (*welcome)();
- welcome = welcomeToBaoding;
- welcome();
- welcome = welcomeToXiAn;
- welcome();
- }
#include "stdio.h"
void welcomeToBaoding(){
printf("welcome to Baoding\n");
}
void welcomeToXiAn(){
printf("welcome to XiAn\n");
}
void main(){
void (*welcome)();
welcome = welcomeToBaoding;
welcome();
welcome = welcomeToXiAn;
welcome();
}
9 利用指针动态分配内存
- #include "stdio.h"
- #include "stdlib.h"
- void main(){
- int length ,i;
- int *p;
- printf("input the num :");
- scanf("%d",&length);
- p = (int*) malloc(length*sizeof(int));
- *p=1;
- *(p+1)=1;
- for(i =2;i<length;i++)
- *(p+i) = *(p+i-2) + *(p+i-1);
- for(i = 0;i<length;i++)
- printf("fabonacci of %d is %d\n",i,*(p+i));
- }