引数の渡し方の仕組みが未だに解ってない

どうすれば,あるポインタを関数に渡して,そのポインタをNULLにできるのかしら.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void to_null(char *c);
void to_free(char *c);

int main()
{
  char * c = NULL;
  printf("%s\n", c); // => (null)
  c = (char *)malloc(sizeof(char) * 4);
  printf("%s\n", c); // => 空文字列
  strcpy(c, "abc");
  printf("%s\n", c); // => abc
  to_null(c);
  printf("%s\n", c); // => abc
  to_free(c);
  printf("%s\n", c); // => abc
  c = NULL;
  printf("%s\n", c); // => (null)
  return 0;
}

void to_null(char *c)
{
  c = NULL;
}

void to_free(char *c)
{
  free(c);
}

う〜ん理解できない.ダメポ.何か見落としてる気がする.charやintって特殊?