前面的东西都比较基础,后面的这个才是真正关键的地方。
示例代码:
#include <iostream> #include <stdlib.h> int main(int argc, char *argv[]) { //argc 指的是参数个数 // argv[0]指的是程序的名字 // argv[1]值的是程序执行的第一个参数 int array[10]={1023,2,3,4,5,6}; int *p = &array[0]; int *p1 = array; printf("%p,%p\n",array,&array[0]); //十六位的地址 //两个地址的值,并且两个地址相同。 printf("*p = %d\n",*p); //1 printf("*p1 = %d\n",*p1); //1 printf("sizeof(array) = %d,sizeof(p1) = %d\n",sizeof(array),sizeof(p1)); //40,8 printf("%d,%d\n",sizeof(int *),sizeof(char *)); //8,8 printf("array =%p,*array =%p,&array = %p\n",array,*array,&array); //地址的值,跟上面的结果一样的,15个0后面1,(如果是32位的操作系统的话,应该是7个0后面一个1),地址的值,跟最上面一样 //这个结果是什么呢? printf("%d\n",*((char *)p1+1)); //这个地方很奇怪,总是觉得有问题。 //但是好像就是 0啊。 return 0; }
运行结果:
这个地方多少有点儿出入,就是为了把那个 结果试出来。所以能看得出来,开始数组里面第一个数字给的是1.
来看看为什么最后一行的结果是3.前面的不知道为什么的同学可以看看这个地址里面书写的内容:
http://www.cnblogs.com/letben/p/5213967.html
void function2(void){ //上面的如果看懂了的话,下面的都比较简单了 char buf[10] = {"abcdef"}; char *pc = buf; printf("%c\n",*(pc+3)); int i = 0x12345678; char *cpi = (char *) &i; printf("%x,%x,%x,%x\n",*(cpi+0),*(cpi+1),*(cpi+2),*(cpi+3)); }
运行结果:
这个表现出操作系统相关性,如果是一般的windows,或者linux都是这种先输出小端的,如果是服务器型的unix的话,就会出现12,34,56,78的结果。
利用指针进行赋值:
代码:
/** 利用指针进行赋值。 */ void function3(void){ int array[10]={0}; int *p = array; for(int i = 0;i<10;i++){ scanf("%d",p++); } for(int i= 0;i<10;i++){ printf("%d\n",array[i]); } }
运行结果:
/** 指针数组 与数组指针 */ void function4(void){ char *s[10];//指针数组 char (*s1)[10];//数组指针 //第一个表达的意思是,有一个数组,里面有10个元素,每个元素都是一个指向 字符数组 类型 的 指针变量。 //所以可以有 char c1[2]; char c2[3]; char c3[4]; s[1] = c1; s[2] = c2; s[3] = c3; //第二个是数组指针,是一个指向有10个字符大小的字符数组的指针变量。 char cc[2][10]; //[Error] cannot convert ‘char [2][5]‘ to ‘char (*)[10]‘ in assignment s1 = cc; s1 = &cc[1]; //这些东西 明天好好在理解一下 int i; int * p; p = &i; //同理: char mychars[10]; s1 = &mychars; }
原文:http://www.cnblogs.com/letben/p/5215295.html