指针访问数组有几下几点不同:
1.通过指针变量,无法获取到指针指向的内容的大小;
2.int * 是确定指针所要寻找的内容的大小,和指针的算数时所需要跳转的字节数量;
3.指针变量是变量可以通过自增方式访问地址名,数字名不能自增。
指针是从高到低分配,却从低到高存储的。这个可以通过语句来表达:
int a = 3;
int b = 5;
int c = 8;
printf("%p\n", &a);
printf("%p\n", &b);
printf("%p\n", &c);
通过输出我们可以看出a比b大4个字节,说明a比b高,那么如果把int b = 8; 改为int b = 0x78563412; 输出的又变成什么了呢。。其实指针就是一个8字节的内存,将16进制的b放到内存当中输出,就是12345678,存储是低位开始,分配写入时却是从高到低,这样就更加让我们理解指针的定义了。
但是我们还需要注意一点,指针不能对long 进行间接寻址,例代码如下:
long x = a;
short *p3 = x;
printf("*p3 = %d\n", *p3);
这样就是错误的,系统会提示 Incompatible integer to pointer convwesion initializing 'short * with an expression of type 'long'; 错误的东西,一定要提醒自己忘记,每天早上打一遍代码,告诉自己我要忘了它!!
请思考:你们知道字符串是什么吗?谁能告诉我明确的答案?
其实,字符串就是一个一维数组,char string[] = "iphone" 和 char string[] = {'i', 'p', 'h', 'o', 'n', 'e'}; 他们是一样的,对吗?我们知道字符串“iPhone” 是占内存的,那么你们知道string也是需要占内存的。
char *string1[] = “iPhone”; //字符串数组,保存的是首地址,存的是'i' 的地址;
还有一点,一旦常量产生了,所有的地址都在这里取,例:printf("%p\n", "iphone"); 不管我们写多少遍这个代码,“iphone”所存的地址都是同一个,需要字符串的时候都是从这里取的,则指针*(string1 + 1) = 'x' 只能读取,不能改变原有的数。
char *string[3] = {"iphone", "android", "win8"}; 这个指针分配的是24个字符。可以用循环将他们的地址都输出出来:
for (int i = 0; i < 3; i++) {
printf("%s\n", strings[i]);
printf("%p\n", strings[i]);
}