不懂指针还敢说你在学习C?!
请先百度:“char * a, char ** a, char * a[], char a[][], char * a[][], char ** a[][], char * a [][][], and so on in memory ” (作者:德哥@Dig)
这个图文并茂,解释的很详细.(就不放链接了,最近csdn老抽风,一放链接就提示:包含禁用的URL)
但看完信息量太大,先简单整理下:
1. 指针相关笔记
1> 指针中的" * "问题
如果前面有类型标识符(int. NSString...),此时" * "只是个标记,表明这是指针;
如果前面无类型标识符,此时" * " 表示取值操作符,它会把指针指向的地址中的内容 取出来或者赋值.
2> 指针的类型(int / float 等) 决定了 从(指针对应的)首地址下取几个字节的内容
3> 看字节数 用sizeof() 函数; 指针所占字节数: 32位 占4字节(byte), 64位 占8字节 (just remember it)
4> 给指针赋值,意味着给指针 重指向 (即 改变指针指向的地址)
5> 设定了函数变量为指针,则调用该函数时,需要使用地址符而非变量
否则会有错误:“Incompatible integer to pointer conversion 。。。”
e.g.
void changeValue(int *number)
则:
changeValue(a); (错误:Incompatible integer to pointer conversion passing 'int' to paremeter of type 'int'… )
changeValue(&a); (正确.)
2. 指针的输出格式及内容:
备注:以64位为例
2.1
char* a="hello";
输出结果:
a %s : hello (输出a所指的地址的全部内容)
a %p :0x5310 (这个是指针a的内容/值,因为a指向的时地址,所以a的内容是地址0x5310)
&a %p:0xbfffed6c (指针a的地址)
*a %c : h (%c输出指针所指的地址的内容,a指的是首地址,所以内容是‘h’)
*a %d : 104 (输出整型,为何是104,还没搞懂。。2014-06-04 待续ing。。??)
*a %x : 68
2.2
char *b =&a;
*b 表示 b是一个指针, 然后char *则是告诉你b指向的是一个指针, 甭管是什么类型的指针,反正b指向的是一个指针, 一个指针占用8字节, 所以b+1就是加8个字节
原文链接: http://blog by 德哥@Dig)
#include
int main() {
char *a[1] = {"abc","def"};
fprintf(stdout, "a[1]:%s\n", a[1]);
return 0;
}
结果 :
[root@db-172-16-3-33 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./b.c -o b && ./b
cc1: warnings being treated as errors
./b.c: In function ‘main’:
./b.c:4: warning: excess elements in array initializer // 超出数组长度. 因为赋值时给了2个元素, 而限定只有1个元素.
./b.c:4: warning: (near initialization for ‘a’)
#include
int main() {
char a[2][10] = {"hello", "world", "linux"};
return 0;
}
结果 :
[root@db-172-16-3-33 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./b.c -o b && ./b
cc1: warnings being treated as errors
./b.c: In function ‘main’:
./b.c:4: warning: excess elements in array initializer // 1维在赋值时给出了3个元素"hello" , "world" , "linux" 因此告警了, 可能导致内存溢出.
./b.c:4: warning: (near initialization for ‘a’)
./b.c:4: warning: unused variable ‘a’